对于我在ruby中工作的项目,我重写了method_missing方法,以便我可以使用类似于此的方法调用来设置变量,类似于在ActiveRecord对象中设置变量:
Object.variable_name= 'new value'
然而,在实现之后,我发现许多变量名都有句号(。)。我找到了这个解决方法:
Object.send('variable.name=', 'new value')
但是,我想知道有没有办法逃避这段时间,以便我可以使用
Object.variable.name= 'new value'
答案 0 :(得分: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
我不想鼓励红宝石愚蠢,但我无法帮助自己!
答案 1 :(得分:1)
我能想到这样做的唯一原因是,如果你真的非常讨厌在你之后维护这段代码的人。
而且我并不是说'他跑过我的狗'仇恨。
我的意思是真正的蒸汽脉冲静脉在寺庙仇恨。
所以,简而言之,不要。 : - )
答案 2 :(得分:0)
如果没有希望更改规范名称,您可以手动为getter和setter设置别名:
def variable_name
send 'variable.name'
end
def variable_name=(value)
send 'variable.name=', value
end