0

因此,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
4

1 回答 1

3

等号不是方法的参数,它是方法名称的一部分。实际上,您可以像这样调用分配:

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
于 2010-12-31T03:01:24.563 回答