rubyのsendメソッドについて

rubysendメソッドは動的にメソッドを呼べるということで、試してみました

class Hoge
  class << self
    def say(name, age)
      if age.empty?
        puts "my name is #{name}, age is secret"
      else
        puts "Hello, #{name}, #{age}"
      end
    end

    def hello
      puts 'Hello world'
    end

    def goodbye
      puts 'Good bye'
    end

    def current_time
      puts Time.now
    end
  end
end

Hoge.say('mikami', 'now_na_young')→Hello, mikami, now_na_young
method = :say
Hoge.send(method, 'mikami', 'now_na_young')→Hello, mikami, now_na_young
Hoge.send(method, 'mikami', '')→my name is mikami, age is secret
method = :hello
Hoge.send(method)→Hello world
method = :goodbye
Hoge.send(method)→Good bye

method_list = [:hello, :goodbye, :current_time]
Hoge.send(method_list.sample)→ランダムで取得します

sendの動きがどういうものなのか、理解しづらかったですが、実際に試してみるとわかりました。

条件分岐も当然できます。

send(メソッド名, 引数)

Hoge.say('mikami', 'now_na_young')→Hello, mikami, now_na_young
method = :say
Hoge.send(method, 'mikami', 'now_na_young')→Hello, mikami, now_na_young
Hoge.send(method, 'mikami', '')→my name is mikami, age is secret

動的の意味がこれですね。

method = :hello
Hoge.send(method)→Hello world
method = :goodbye
Hoge.send(method)→Good bye

method_list = [:hello, :goodbye, :current_time]
Hoge.send(method_list.sample)→ランダムで取得します

引数で取れるから、リファクタリングに活用できそう。

これがメタプログラミングの特徴みたいですね。

色々できそうなんで、メタプログラミングもどんどん吸収していきたいな。

ref.xaio.jp