kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

Rubyのevalの利用例

割とRubyだと動的にメソッドを定義することで、evalを利用することがあります。 gem Faradayでは、structクラスと併用することで使われています。 ただし、evalを利用する事は、非常に可読性が落ちたりや、デバックがしにくくなることから、とにかく 批判を受けがちです。
内部のロジックが同様なメソッドメソッド名とパラメータ名だけ変えたい場合に使います。

eval

evalの引数には、文字列が渡せるので、"",''だけではなく、ヒアドキュメントを渡す実装も見受けられます。 gem faradayのコード

eval

# 動かないです。
eval <<-"EOS"
    def new_methods
      %w(office category).each do |name|
        eval<<"EOS"
           def area_in_#{name}(ksjcd="")
             conn.get '&ksjcd=#{ksjcd}'
           end
        EOS
      end
    end
EOS

動的にメソッドを生成したい場合で、メソッド名や、パラメータが変わるだけなら、重複するコードは避けて この方がすっきりしますよね。instace_eval, class_eval, evalの違いについては、また次回、記事したいと思います。

evalの記述自体は、否定的な意見を多くきくのですが、gemなどのコードでは多用されているので、業務レベルで多用されていないということでしょうかね。 あくまでも、私の周りにかぎりますが。

以上です。