Menu
Coddy logo textTech

定数

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
challenge icon

チャレンジ

簡単

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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rubyオンラインコンパイラ