define_methodでハマった。
夏休みも残すところ一週間弱。
最近はTeamsの開発の手をちょっと止めて、Rubyの言語仕様を勉強したり、
友達に頼まれてChrome拡張作らされたりといった日々を過ごしています。
Rubyはクックブックを主に読み込んでいます。
その中のレシピ4.10でハマりました。
[Ruby]
class Numeric
[[“add”,”+”],[“subtract”,”-“],[“multiply”,”*”],[“divide”,”/”]].each do |method,operator|
define_method(“#{method}_2”) do
method(operator).call(2)
end
end
end
puts 4.add_2
[/Ruby]
なんてことないadd_2〜divide_2というメソッドを定義するだけのレシピ、しかし、
methodの中にadd〜divideが順次読み込まれるので、
定義されたメソッドの中にadd(operator).call(2)のように
再帰的に読まれるように一見思えてしまいます。
結論から言うとeachの引数でもらうmethod
[Ruby]
[[“add”,”+”],[“subtract”,”-“],[“multiply”,”*”],[“divide”,”/”]].each do |method,operator|
[/Ruby]
define_methodで定義するメソッドの中身のブロックに書かれるmethodが重複していて紛らわしく、
[Ruby]
method(operator).call(2)
[/Ruby]
ハマっちゃいました。
前者は単なるeachのローカル変数、後者はmethodというメソッドなのですね。
addの場合はmethod(+).call(2)のような挙動となり、
単純に2を足して返すだけの関数となるわけです。
ここもうちょっと変数名変えて書いてほしいななんて思った今日このごろ。