2

对于我正在使用 ruby​​ 进行的项目,我将覆盖 method_missing 方法,以便我可以使用这样的方法调用设置变量,类似于在 ActiveRecord 对象中设置变量:

Object.variable_name= 'new value'

然而,在实现这个之后,我发现许多变量名中都有句点 (.)。我找到了这个解决方法:

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

但是,我想知道有没有办法逃脱这个时期,这样我就可以使用

Object.variable.name= 'new value'

4

3 回答 3

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

我不想鼓励红宝石傻,但我就是忍不住!

于 2008-09-08T06:58:22.673 回答
1

我能想到这样做的唯一原因是,如果您真的非常讨厌将在您之后维护此代码的人。

我的意思不是“他跑过我的狗”仇恨。

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

所以,简而言之,不要。:-)

于 2008-09-19T17:32:01.953 回答
0

如果没有希望更改规范名称,您可以手动为 getter 和 setter 起别名:

def variable_name
 send 'variable.name'
end

def variable_name=(value)
 send 'variable.name=', value
end
于 2008-09-08T12:31:01.610 回答