因此,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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top