【发布时间】:2019-12-05 02:57:39
【问题描述】:
我正在阅读如何使用元编程来制作属性访问器的示例,但我对这个值变量的来源有点困惑:
class AttrAccessorObject
def self.my_attr_accessor(*names)
names.each do | name |
define_method(name) {
self.instance_variable_get("@#{name}".to_sym)
}
define_method("#{name}=") do | value |
self.instance_variable_set("@#{name}".to_sym, value)
end
end
end
end
我知道instance_variable_set方法需要实例变量和值来设置实例变量的新值,但是代码中的这个值变量是从哪里来的呢?另外,由于它使用“do/end”循环来使用该值,我假设“define_method("#{name}=") 评估为一个值数组,对吗?
【问题讨论】:
-
value是方法签名的一部分。这意味着定义的方法将接受一个参数。如果您使用两个变量define_method("#{name}_with_two") do | value1, value2 |- 定义的方法将接受两个参数。 -
do ... end不是循环。它是一个块,在 Ruby 中是一个无处不在的概念。在阅读 Ruby 之前,您必须了解块。例如,here。具体来说,define_method定义了一个方法,并将块附加为方法的主体。 -
@Fabio 啊哈,我明白了。那么“值”本质上就是将传递给已定义方法的参数?
-
@Karen:正是如此。
-
太棒了!感谢您对块的解释和澄清!
标签: ruby metaprogramming attr-accessor