Hyurakuのエンジニア日誌

SE出身Webエンジニアのブログ

rubyの文字列をメソッドとして扱えるsendメソッドについて #2

実際に"某変数をメソッドとして使用したいが、型が文字列なので実行できない"と困ったときに
学んだメソッドsendについて振り返った。

1. sendメソッドについて

公式ガイドより参照。

send (Object)
--< 省略 >--

obj.send(name, [arg, ...])

--< 省略 >--
sendメソッドは、レシーバの持っているメソッドを呼び出します。第1引数nameにはメソッド名をシンボルか文字列で指定します。メソッドの引数を指定したいときは、第2引数arg以降に引数を並べます。戻り値は、呼び出したメソッドの戻り値が返ります。

2. 実際に書いてみた。

今回は、次のファイル(index.rb)を作成した。

class Drink
  def price(n = 100)
    "This drink is #{n} yen!"
  end

  private
  def ad
    "Buy this"
  end
end

one = Drink.new

p one.send(:price)
p one.send("price",120)

結果は下のようになった。

> ruby index.rb
"This drink is 100 yen!"
"This drink is 120 yen!"
"Buy this"

今回分かることは2つ。

  • 結果の1行目と2行目からは型がシンボルで書かれたメソッドでも文字列で書かれたメソッドでも
    send()を使用して実行可能なことが分かる。

  • 結果の3行目からプライベートなメソッドでもsend()を使用して実行できることが分かる。
    もちろんprivateのメソッドについてはメソッドのまま使用するとエラーが発生する。