定数
CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 14/57。
定数は大文字で始まり、慣例として大文字で記述されます。クラス本体で定義すると、クラスのすべてのメソッドで名前を使って参照できます。クラスの外では、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のキーでない場合、ArgumentErrorを発生させ、unknown shipping: droneとなります。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オンラインコンパイラ