2008-09-08 138 views
2

对于一个项目,我在Ruby中工作,我重写的method_missing方法,这样我可以用一个方法调用这个样子,类似于一个ActiveRecord对象设置变量设置变量:红宝石方法名

Object.variable_name= 'new value'

但是,在实现这个之后,我发现很多变量名都有句号(。)。我发现这个解决方法:

Object.send('variable.name=', 'new value')

不过,我想知道有没有办法逃避的时期,这样我可以使用

Object.variable.name= 'new value'

回答

9

不要这么做!

试图创建在您的语言中无效的标识符不是一个好主意。如果你真的想设置这样的变量,使用属性宏:

attr_writer :bar 
attr_reader :baz 
attr_accessor :foo 

好了,现在你已经被警告了,这里是如何做到这一点。每次获得常规访问者时,只需返回同一个类的另一个实例,并随时收集所需的信息。

class SillySetter 
    def initialize path=nil 
    @path = path 
    end 

    def method_missing name,value=nil 
    new_path = @path ? "#{@path}.#{name}" : name 
    if name.to_s[-1] == ?= 
     puts "setting #{new_path} #{value}" 
    else 
     return self.class.new(path=new_path) 
    end 
    end 
end 

s = SillySetter.new 
s.foo = 5    # -> setting foo= 5 
s.foo.bar.baz = 4  # -> setting foo.bar.baz= 4 

我不想鼓励红宝石sillyness,但我就是控制不住自己!

0

如果没有改变的规范名称的希望,你可以手动别名getter和setter方法:

def variable_name 
send 'variable.name' 
end 

def variable_name=(value) 
send 'variable.name=', value 
end 
1

我能想到的这样做的唯一原因,就是如果你真的真的很讨厌的人谁在你之后将会保持这个代码。

我并不是说'他跑过我的狗'的仇恨。

我的意思是真正的热气腾腾的寺庙仇恨脉脉。

所以,总之,不要。 :-)