ruby – 在“class << self”定义中缺少常量和“const_missing”

前端之家收集整理的这篇文章主要介绍了ruby – 在“class << self”定义中缺少常量和“const_missing”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在类中定义const_missing和其他类方法时,我对 Ruby的行为感到非常困惑<<自定义而不是使用def self.foo语法. 我试图做这样的事情:
class Foo
  class << self
    def foo
      puts MISSING
    end

    def const_missing(name)
      puts "#{name} missing"
    end
  end
end

Foo.foo

我主要使用类<<用于定义类方法的自语法.但是,它没有按预期工作.永远不会调用const_missing.以上结果是NameError. 定义这样的两种方法按预期工作:

def self.foo
  puts MISSING
end

def self.const_missing(name)
  puts "#{name} missing"
end

我认为班级<<自语法只是定义类方法的另一种方法,但完全等同于def self.foo?我用MRI 1.8.7,1.9.2和JRuby 1.5.6测试了上述内容.显然我在这里遗漏了一些东西? 非常感谢任何提示. 谢谢,马丁

解决方法

class<< self不是定义类方法的捷径.这种语法(我不知道确切的命名)打开了一个对象(在你的例子中是一个类)的本征类.有了它,您可以定义对象的方法(而不是实例方法).但是当你将一个常量调用到本征类时,你从本征类调用一个常量,而不是从类中调用.在这种情况下,你必须在const_missing的本征类上定义一个类方法,有两种方法
class Test
  class << self
    def foo
      p MISSING
    end

    # First way: (Syntax sugar for the second way)
    def self.const_missing(name)
      name
    end

    # Second way:
    class << self # eigenclass of the eigenclass of the class
      def const_missing(name)
        name
      end
    end

  end
end

Test.foo #=> :MISSING

猜你在找的Ruby相关文章