我想从对象中存储和检索一些变量。例如,在a
a = "a"
到目前为止,我找到了两种可能的方法。
使用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
对我来说,第二种方法看起来更短更简单,如果我更喜欢这个,我的代码有什么问题吗?
答案 0 :(得分:5)
速度并非一切,但...... instance_variable_set
方法比使用instance_eval
更快。如果您有兴趣,这是一个基准:https://gist.github.com/1268188
这是另一篇文章,它提供了在可能的情况下避免instance_eval
的另一个充分理由:Alex Kliuchnikau on instance_eval
答案 1 :(得分: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
在这种情况下,它更短:)