红宝石方法名称

时间:2020-03-05 18:49:11  来源:igfitidea点击:

对于我正在使用ruby进行的项目,我重写了method_missing方法,以便可以使用像这样的方法调用来设置变量,类似于在ActiveRecord对象中设置变量:

Object.variable_name ='新值'

但是,执行此操作后,我发现许多变量名称中都带有句点(。)。我发现此解决方法:

Object.send('variable.name =','新值')

但是,我想知道是否有一种方法可以逃脱这段时期,以便我可以使用

Object.variable.name ='新值'

解决方案

回答

不要做!

尝试创建在语言中无效的标识符不是一个好主意。如果我们确实想要设置这样的变量,请使用属性宏:

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

我不想鼓励红宝石愚蠢,但我无能为力!

回答

如果不希望更改规范名称,则可以手动为getter和setter设置别名:

def variable_name
 send 'variable.name'
end

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

回答

我能想到的唯一原因是,如果我们真的真的讨厌在我们之后要维护此代码的人。

我并不是说"他撞到了我的狗"的仇恨。

我的意思是在圣殿仇恨中真正冒出的脉动脉搏。

因此,总之,不要。 :-)