本文へスキップ
BecomeCoder

Rubyコース · 第7章 クラスとオブジェクト指向 · レッスン33

to_s・selfとクラスメソッド

ブラウザで完結

導入

オブジェクトputs でそのまま表示したいときや、「特定のオブジェクトに属さない、クラス全体で使う処理」を作りたいときがあります。それぞれ to_s メソッドとクラスメソッドで実現します。

説明

to_s メソッドを定義しておくと、puts オブジェクト文字列補間 "#{オブジェクト}" のときに自動的に呼ばれます。

class Point
  def initialize(x, y)
    @x = x
    @y = y
  end

  def to_s
    "(#{@x}, #{@y})"
  end
end

p1 = Point.new(1, 2)
puts p1
puts "座標: #{p1}"

self は「このメソッドを呼んでいるオブジェクト自身」を指します。def self.メソッド名 と書くと、個々のオブジェクトではなくクラス自身に対して呼び出すクラスメソッドを定義できます。

class MathHelper
  def self.double(n)
    n * 2
  end
end

puts MathHelper.double(21)

クラスメソッドは、MathHelper.new でオブジェクトを作らなくても MathHelper.double(21) のように直接呼び出せます。「特定のインスタンスに関係しない、道具として使うメソッド」によく使われます。

やってみよう

Point に別の to_s の中身を試してみましょう。MathHelperself.square(n) のような別のクラスメソッドを追加してみてください。

演習

Temperature クラスに self.to_fahrenheit(celsius) というクラスメソッドを定義し、celsius * 9 / 5.0 + 32 を返すようにしてください。Temperature.to_fahrenheit(20)puts で表示してください(68.0)。

ヒント1を見る

class Temperature def self.to_fahrenheit(celsius) celsius * 9 / 5.0 + 32 end end のように書きます。

ヒント2を見る

puts Temperature.to_fahrenheit(20) のように呼び出します。

実際に動かしてみよう

下のエディタにRubyを書いて「実行」を押すと、学習用シミュレータが puts / print / p の出力を表示します(本物のRubyではなく、教材の範囲を再現した軽量な自作エンジンです)。配列・ハッシュ・ブロック(each/map/select)・メソッド・クラス・モジュール・例外なども動きます。本文の例を書き換えて動かしてみましょう(gem・Rails・ファイル入出力など一部の機能は対象外です。文字列を伸ばすときは str << も可能ですが、変数に反映されるのは str += です)。

Ruby — ブラウザ内で実行(学習用シミュレータ)

Rubyの教材サブセットを動かす学習用シミュレータを読み込みます(本物のRubyではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。