3

我想从对象中存储和检索一些变量。例如在a

a = "a"

到目前为止,我找到了两种可能的方法。

  • 使用instance_variable_setinstance_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
    

第二种方法对我来说看起来更短更简单,如果我更喜欢这个,我的代码有什么问题吗?

4

2 回答 2

5

速度不是一切,但是......该instance_variable_set方法比使用instance_eval. 如果您有兴趣,这里有一个基准:https ://gist.github.com/1268188

这是另一篇文章,它给出了尽可能避免使用的另一个很好的理由instance_evalAlex Kliuchnikau on instance_eval

于 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 回答