这个ruby自定义访问器如何工作

时间:2010-12-31 02:49:40

标签: ruby metaprogramming accessor class-eval

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

1 个答案:

答案 0 :(得分: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