这个红宝石自定义登录器如何工作
-
14-10-2019 - |
题
因此,class_eval中的下面方法动态创建了在运行时定义的属性的访问者。例如,它可以使用从配置文件中读取属性(直到运行时未知)来创建配置对象。除了其他分支外,我都会理解所有这些。如果我纠正了其他分支,则如果在 *val中传递了一个值,则返回属性值(Val [0])。但是,如果它的书面方式我希望它返回一个数组(val),如果有一个值在 *var中传递的值更多。特别是,如果我有以下内容:
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
不隶属于 StackOverflow