Menu
Coddy logo textTech

クラスメソッド

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 Circle

class << 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.2

1つのオブジェクトではなく、ある種類のものに属する処理にはクラスメソッドを使います。単位の変換、テキストのオブジェクトへの解析、すべてのインスタンスの数の保持などがこれに当たります。1つのオブジェクトのデータを必要とする処理には、インスタンスメソッドを使います。

class Invoice
  def self.tax_rate      # すべての請求書で同じ
    0.2
  end

  def tax                # この請求書の金額が必要
    @amount * Invoice.tax_rate
  end
end
challenge icon

チャレンジ

簡単

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

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

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

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