クラスメソッド
CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 12/57。
クラスメソッドは、1つのインスタンスではなくクラスに属します。クラス本体ではselfがクラスなので、def self.nameはクラスにメソッドを定義します。クラス自体に対して呼び出します:
class Temperature
def self.to_fahrenheit(celsius)
celsius * 9 / 5.0 + 32
end
end
puts Temperature.to_fahrenheit(100)
puts Temperature.to_fahrenheit(-40)出力:
212.0
-40.0クラスメソッドとインスタンスメソッドは、異なる場所に存在します。インスタンスはクラスメソッドを直接呼び出すことはできません。self.classまたはクラス名を通じてアクセスします。
class Circle
def self.area_for(r)
(3.14159 * r * r).round(2)
end
def initialize(r)
@r = r
end
def area
self.class.area_for(@r)
end
end
puts Circle.area_for(1)
puts Circle.new(2).area
begin
Circle.new(2).area_for(2)
rescue NoMethodError => e
puts e.message
end出力:
3.14
12.57
undefined method `area_for' for an instance of Circleclass << self は、クラス本体の中で、すべての def がクラスメソッドになるセクションを開きます。クラスにクラスメソッドが複数ある場合、self. と書く手間を省けます。
class Units
class << self
def km_to_miles(km)
(km * 0.621371).round(1)
end
def miles_to_km(miles)
(miles / 0.621371).round(1)
end
end
end
puts Units.km_to_miles(10)
puts Units.miles_to_km(26.2)出力:
6.2
42.21つのオブジェクトではなく、ある種類のものに属する処理にはクラスメソッドを使います。単位の変換、テキストのオブジェクトへの解析、すべてのインスタンスの数の保持などがこれに当たります。1つのオブジェクトのデータを必要とする処理には、インスタンスメソッドを使います。
class Invoice
def self.tax_rate # すべての請求書で同じ
0.2
end
def tax # この請求書の金額が必要
@amount * Invoice.tax_rate
end
endチャレンジ
簡単Temperature のクラスメソッドを完成させてください。to_fahrenheit(c) と to_celsius(f) は値を変換します。feel(celsius) は、0 未満では freezing、15 未満では cold、25 未満では mild、それ以外では hot を返します。convert(text) は 20 C や 68 F のようなテキストを受け取り、20.0 C = 68.0 F (mild) または 68.0 F = 20.0 C (mild) を返します。小数第 1 位まで表示し、摂氏値の体感温度を含めます。また、他のクラスメソッドを使用します。
提供されたコードは、各入力行に対して Temperature.convert(line) を呼び出し、結果を出力します。Temperature のインスタンスは作成されません。
コードは temperature.rb に記述してください。main.rb には提供された入出力コードが含まれており、編集できません。
自分で試してみよう
require_relative 'temperature'
# 提供された入出力コード: そのままにしておく
input = []
while (line = gets)
input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ