在使用定义const_missing和定义中的其他类方法class << self而不是使用def self.foo语法时,我对Ruby的行为感到非常困惑.
我试图做这样的事情:
class Foo
class << self
def foo
puts MISSING
end
def const_missing(name)
puts "#{name} missing"
end
end
end
Foo.foo
Run Code Online (Sandbox Code Playgroud)
我主要使用class << self语法来定义类方法.但是,它没有按预期工作.const_missing永远不会被称为.以上结果是NameError.
定义这样的两种方法按预期工作:
def self.foo
puts MISSING
end
def self.const_missing(name)
puts "#{name} missing"
end
Run Code Online (Sandbox Code Playgroud)
我认为class << self语法只是定义类方法的另一种方式,但完全等同于def self.foo?我用MRI 1.8.7,1.9.2和JRuby 1.5.6测试了上述内容.显然我在这里遗漏了一些东西?
非常感谢任何提示.
谢谢,马丁
Gui*_*nal 12
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3717 次 |
| 最近记录: |