상수
Coddy Ruby 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 14번째.
상수는 대문자로 시작하며 관례상 대문자로 작성됩니다. 클래스 본문에서 정의하면 클래스의 모든 메서드에서 이름으로 사용할 수 있습니다. 클래스 외부에서는 ClassName::NAME과 같이 작성합니다.
class Account
MIN_BALANCE = -100
def self.allowed?(balance)
balance >= MIN_BALANCE
end
end
puts Account::MIN_BALANCE
puts Account.allowed?(-50)
puts Account.allowed?(-150)출력:
-100
true
false상수는 제한이나 조회 테이블처럼 클래스 전체에서 사용하는 고정된 데이터에 적합합니다. 해시 상수에서 fetch를 사용하면 알 수 없는 키에 대해 조용히 nil을 반환하는 대신 KeyError를 발생시킵니다:
class Shipping
RATES = { "standard" => 5, "express" => 12 }.freeze
def self.cost(method)
RATES.fetch(method)
end
end
puts Shipping.cost("express")
begin
Shipping.cost("drone")
rescue KeyError => e
puts e.message
end출력:
12
key not found: "drone"상수 이름이 새 객체를 가리키도록 할당되면 Ruby가 경고를 출력하지만, 상수가 참조하는 객체 자체는 여전히 변경할 수 있습니다. freeze는 객체 자체를 읽기 전용으로 만들어 변경을 시도하면 FrozenError가 발생합니다:
class Palette
COLORS = ["red", "green"].freeze
end
begin
Palette::COLORS << "blue"
rescue FrozenError => e
puts e.message
end
p Palette::COLORS
p Palette::COLORS.frozen?출력:
can't modify frozen Array: ["red", "green"]
["red", "green"]
true값이 어떻게 동작하는지에 따라 선택하세요. 절대 변경되지 않는 값은 동결된 상수에 속하고, 카운터처럼 프로그램이 실행되는 동안 변경되는 상태는 클래스 인스턴스 변수에 속합니다:
class Ticket
PREFIX = "TK" # 고정: 상수
@issued = 0 # 변경: 클래스 인스턴스 변수
def self.next_code
@issued += 1
"#{PREFIX}-#{@issued}"
end
end챌린지
쉬움Order 클래스를 완성하세요. 이 클래스에는 RATES(동결된 해시: standard는 5, express는 12, pickup은 0)와 FREE_FROM(50) 상수가 있습니다. initialize(total, method)는 method가 RATES의 키가 아닐 때 unknown shipping: drone이라는 메시지와 함께 ArgumentError를 발생시킵니다. shipping은 합계가 FREE_FROM 이상이면 0을 반환하고, 그렇지 않으면 해당 요금을 반환하며, to_s는 40.00 + 5 express = 45.00을 반환합니다.
제공된 코드는 상수를 사용하여 free from 50을 출력한 다음, total method 형식의 줄로 주문을 읽고 각 주문 또는 오류 메시지를 출력합니다.
코드는 order.rb에 작성하세요. main.rb에는 제공된 입력/출력 코드가 포함되어 있으며 수정할 수 없습니다.
직접 해보기
require_relative 'order'
# 제공된 입력/출력 코드: 그대로 유지하세요
input = []
while (line = gets)
input << line.chomp
end
puts "free from #{Order::FREE_FROM}"
input.each do |line|
total, method = line.split
begin
puts Order.new(total.to_f, method)
rescue ArgumentError => e
puts e.message
end
end
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Ruby 컴파일러