【问题标题】:ruby method names红宝石方法名称
【发布时间】:2010-09-08 03:13:13
【问题描述】:

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

Object.variable_name= 'new value'

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

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

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

Object.variable.name= 'new value'

【问题讨论】:

    标签: ruby


    【解决方案1】:

    别这样!

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

    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
    

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

    【讨论】:

      【解决方案2】:

      如果无法更改规范名称,您可以手动为 getter 和 setter 设置别名:

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

      【讨论】:

        【解决方案3】:

        我能想到这样做的唯一原因是,如果你真的很讨厌在你之后维护这段代码的人。

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

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

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

        【讨论】:

          猜你喜欢
          • 2015-03-21
          • 1970-01-01
          • 2011-05-05
          • 2011-02-28
          • 2013-03-19
          • 2023-04-07
          • 2019-06-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多