gpt4 book ai didi

ruby - "const_missing"定义中缺少常量和 "class << self"

转载 作者:数据小太阳 更新时间:2023-10-29 06:53:20 24 4
gpt4 key购买 nike

在定义 const_missing 时,我对 Ruby 的行为感到非常困惑和 class << self 中的其他类方法定义而不是使用 def self.foo句法。

我正在尝试做这样的事情:

class Foo
class << self
def foo
puts MISSING
end

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

Foo.foo

我主要使用 class << self定义类方法的语法。但是,它没有按预期工作。 const_missing永远不会被调用。以上结果导致 NameError。

像这样定义这两种方法按预期工作:

def self.foo
puts MISSING
end

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

我认为 class << self syntax 只是定义类方法的另一种方式,但完全等同于 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 - "const_missing"定义中缺少常量和 "class << self",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5304162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com