Rubyのメソッド

メソッドの分類

・関数的メソッド
・インスタンスメソッド
・クラスメソッド

破壊的なメソッド

レシーバにあたるオブジェクトの値そのものを変更してしまうメソッド

関数的メソッド

レシーバが無いメソッド

# 例

print "あいうえお"
sleep(10)

関数的メソッドを作る

def メソッド名(引数)
  処理
end

返り値

def メソッド名(引数)
  処理
  return 返り値
end

※return を省いても、最後の行(endの上)に記述されている変数がそのまま返り値になる

インスタンスメソッド

オブジェクト(インスタンス)をレシーバとするメソッド

# 例

text.to_i
"10,20,30,40".split(",")
[1,2,3,4].index(2)
1000.integer?

インスタンスメソッドを作る

class Robot

  def initialize(name)
    @name = name
    @x = @y = 0
  end

  def move(x, y)
    @x += x
    @y += y
  end

  def to_s
    "#{@name}:#{@x},#{@y}"
  end

end

robo1 = Robot.new("ロボ1号")
robo2 = Robot.new("ロボ2号")
puts robo1         #=> ロボ1号:0,0
robo2.move(10,20)  # robo2::move(10,20) とも書ける
puts robo2         #=> ロボ2号:10,20

メソッドの呼び出し制限

・public   :どこからでも呼び出せる。デフォルト
・protected:同じクラス、サブクラス内の中だけで呼び出せる。レシーバを付けても呼び出せる
・private  :同じクラス、サブクラス内の中だけで呼び出せる。レシーバを付けると呼び出せない

メソッドの呼び出し制限:指定の仕方

# 個別指定

class Test

  def pub
    puts "public"
  end
  public :pub

  def priv
    puts "private"
  end
  private :priv

end

# まとめて指定

class Test

  public  # 以降、public
  def pub
    puts "public"
  end

  def pub2
    puts "public2"
  end

  private  # 以降、private
  def priv
    puts "private"
  end

  def priv2
    puts "private2"
  end

end

privateの例

class Robot

  def initialize(name)
    @name = name
    @x = @y = 0
  end

  def move(x, y)
    @x += x
    @y += y
    crash if @x < -100 || @x > 100 || @y < -100 || @y > 100
  end

  private  # privateなメソッド
  def crash
    puts "クラッシュ!"
  end

end

robo1 = Robot.new("ロボ1号")
robo1.move(200,100)  # エラーは発生しない
robo1.crash          # エラーが発生する

組み込みクラスを拡張する

class String
  def count_word
    a = self.split(/\s+/)
    return a.size
  end
end

str = "Good morning everyone"
print str.count_word

特異メソッド

個々のオブジェクトに定義することもできる

str = "Ruby入門"

def str.edition(n)
  "#{self} 第#{n}版"
end

print str.edition(3)  #=> Ruby入門 第3版

※組み込み定数にメソッドを設定する場合などに使える

クラスメソッド

クラスそのものをレシーバとするメソッド

# 例

a = Array.new
f = File.open("some_file")
t = Time.now

クラスメソッドを作る

class Hello
  def Hello.hello(name)
    print name, "said hello"
  end
end

Hello.hello("Bob")  #=> Bob said hello  ※ Hello::hello("Bob") とも書ける