3

オブジェクトからいくつかの変数を保存および取得したい。たとえば、a

a = "a"

これまでのところ、2つの可能な方法を見つけました。

  • instance_variable_setと_instance_variable_get

    a.instance_variable_set(:@x, 10)
    a.instance_variable_get(:@x) # => 10
    
  • または単に使用するinstance_eval

    a.instance_eval { @y = 5 }
    a.instance_eval { @y } # => 5
    

2 番目のアプローチは、私にとってはより短くシンプルに見えます。この方法を好む場合、コードに何か問題がありますか?

4

2 に答える 2

5

速度がすべてではありませんが、...instance_variable_setメソッドを使用するよりも高速ですinstance_eval。興味のある方は、こちらのベンチマークをご覧ください: https://gist.github.com/1268188

可能であれば回避する別の正当な理由を示す別の投稿を次に示しますinstance_eval: instance_eval に関する Alex Kliuchnikau

于 2012-08-31T14:22:28.700 に答える
2

正当な理由 (メタプログラミングなど) がない場合は、instance_variable_get(set) の使用を避ける方がよいでしょ。ruby-doc を参照できます。これにより、適切なカプセル化を提供しようとするクラスの作成者の努力が妨げられます。

また、instance_eval を使用するベスト プラクティスは、DSL スタイルを構成することです。

インスタンス メソッドを持つ Engineer クラスがあるとします: program、play、sleep。そう、

sb = Engineer.new

sb.program
sb.play
sb.sleep

# is equivalent to
sb.instance_eval do
  program
  play
  sleep
end

この場合、それは短くなります:)

于 2012-08-31T14:57:42.677 に答える