0

method_missing用来为词汇表中的命名空间常量定义一个类。为了有效,我需要继承自 的词汇类BasicObject,否则没有任何标准对象方法可用作词汇术语(因为该方法没有丢失:)。但是,当我从 继承时BasicObject,我发现我无法在另一个模块中调用实用程序方法。以下代码以精简形式说明了该问题:

module Foo
  class Bar
    def self.fubar( s )
      "#{s} has been fubar'd"
    end
  end
end

class V1
  def self.method_missing( name )
    Foo::Bar.fubar( "#{name} in v1" )
  end
end

class V2 < BasicObject
  def self.method_missing( name )
    Foo::Bar.fubar( "#{name} in v2" )
  end
end

# this works
puts V1.xyz
# => xyz in v1 has been fubar'd

# this doesn't
puts V2.xyz
# => NameError: uninitialized constant V2::Foo

当我尝试调用帮助程序模块时,我需要添加什么V2以便它不会产生统一的常量错误?

4

1 回答 1

3

如果您V2像这样更改方法以便名称解析在全局范围内开始,它会起作用。

def self.method_missing( name )
  ::Foo::Bar.fubar( "#{name} in v2" )
end

我在文档中为您查找了它:

BasicObject 不包括内核(用于 puts 等方法),并且 BasicObject 位于标准库的命名空间之外,因此如果不使用完整的类路径,将无法找到通用类。... 通过从根目录(如 ::File 或 ::Enumerator)引用所需的常量,可以在 BasicObject 子类中访问 Ruby 标准库中的类和模块。

于 2012-06-13T11:00:09.383 回答