【发布时间】:2013-02-04 21:50:06
【问题描述】:
假设我有一个简单的对象。我有attr_accessors 用于我想要接受的属性,并且我希望能够使用对象哈希进行初始化:
class Example
attr_accessor :foo, :bar
def initialize( attributes = {} )
attributes.each do |k,v|
...
end
end
end
在上面的attributes.each块中,使用send会更好吗,像这样:
send "#{k}=", v
或者使用instance_variable_set,像这样:
instance_variable_set "@#{k}".to_sym, v
...还是完全做其他事情?
我能想到的区别是:
如果在某个时候我将其中一个
attr_accessors替换为setter 方法,那么使用send会更加一致。如果传递了意外的值,使用
send会引发NoMethodError
出于这些原因,我倾向于send —— 实际上,我有点喜欢NoMethodError 被提出用于伪造初始化数据的可能性。但是,我在这里是否忽略了其他任何因素,尤其是性能和安全方面的考虑?
我感谢任何见解。谢谢!
【问题讨论】:
-
我会使用
send,除非我有充分的理由不这样做;作为一般规则,我更喜欢我的对象在与自己对话时使用外部接口,这样可以减少维护麻烦。顺便说一句,如果您不想要明确的to_sym呼叫,您可以说:"@#{k}"。 -
@muistooshort:感谢
:""的提示,不知道!
标签: ruby metaprogramming