sendメソッドについて

【結論】

・sendメソッドとは、レシーバーの持っている
 メソッドを呼び出すメソッド

・第二引数に指定した値を
 呼び出したメソッドの引数に渡す事も出来る

・呼び出したいメソッドを変数で指定して
 条件分岐させる際などに有用である

【目次】

【本題】

sendメソッドについて

sendメソッドとは、
レシーバーの持っているメソッドを呼び出す為のメソッドです。

#Fruitクラスと、そのインスタンスメソッドのappleを定義する
class Fruit
  def apple
    puts "2万円です"
  end
end

#Fruitクラスのインスタンスを生成する
fruit = Fruit.new

# レシーバであるfruitが持っているメソッドのappleを呼び出す
fruit.send(:apple)
=> 2万円です

第二引数でメソッドの引数を指定可能

また、sendメソッドは、第二引数に値を指定すると、
呼び出したメソッドの引数に渡す事も出来ます。

#Fruitクラスと、そのインスタンスメソッドのappleを定義する
class Fruit
  def apple(money)
    puts "#{money}万円です"
  end
end

#Fruitクラスのインスタンスを生成する
fruit = Fruit.new

# レシーバであるfruitが持っているメソッドのappleを呼び出す
fruit.send(:apple, 100)
=> 100万円です

利用シーン

sendメソッドは、呼び出したいメソッドを
変数で指定したい場合に有用です。

class Fruit
  def apple
    puts "20円です"
  end

  def melon
    puts "100円です"
  end
end

fruit = Fruit.new

favorite_color = "red"
favorite_food = favorite_color == 'red' ? 'apple' : 'melon'

# 変数でメソッドを呼び出す事が可能
fruit.send(favorite_food)
=> 20円です

# 直接メソッドを実行する場合、変数は指定出来ない
fruit.favorite_food
=> NoMethodError: undefined method `favorite_food'

これにより出力したい内容を条件分岐させたり、
コードを共通化させる際に役立ちます。

なお、呼び出すメソッドが決まっている場合は
記述が冗長になるので、利用は控えた方が良いと考えています。

#直接メソッドを実行する場合
fruit.apple
=> 2万円です

# sendメソッドの場合
fruit.send(:apple)
=> 2万円です

参考情報

http://ref.xaio.jp/ruby/classes/object/send

【Ruby on Rails】sendメソッドのいろんな書き方 - Qiita