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万円です