因此,下面class_eval中的方法为运行时定义的属性动态创建访问器。例如,它可以用于创建具有从配置文件读取的属性的配置对象(直到运行时才知道)。除了else分支,我了解所有内容。如果我是正确的,则在* val中传递一个值时,else分支将返回属性值(val [0])。但是,如果在* var中传递了一个以上的值,我期望它的编写方式返回一个数组(val)。特别是如果我有以下内容:
value = 5
然后阅读我期望的代码@value to be [=,5]
。但是,@value
返回5,而不返回数组[=,5]。这怎么可能?
class Module
def dsl_accessor(*symbols)
symbols.each do |sym|
class_eval %{
def #{sym}(*val)
if val.empty?
@#{sym}
else
@#{sym} = val.size == 1 ? val[0] : val
end
end
}
end
end
end
等号不是方法的参数,它是方法名称的一部分。实际上,您可以像这样调用作业:
value=(5)
所以只有整数5是该函数的参数。
class Module
def dsl_accessor(*symbols)
symbols.each do |sym|
class_eval %{
def #{sym}
@#{sym}
end
def #{sym}=(val)
@#{sym} = val
end
}
end
end
end