1

我试图在一个类中包含一个模块中的方法,并让包含的方法访问正在执行包含的基类的类变量,但它不像我假设的那样工作。代码:

class Awesome
    @@name = "ME!"
end

module MyGem
    module Namespace
        def typist
            puts @@name
        end
    end
end

if defined? Awesome
    Awesome.class_eval do
        include MyGem::Namespace
    end
end

Awesome.new.typist # Test our new 'injected' instance method!
#=> NameError: uninitialized class variable @@name in MyGem::Namespace

显然,我对 Rubyinclude行为的理解是不可靠的,我认为 include 会将方法合并到基类中,并且执行上下文将是基类,但错误消息似乎暗示包含方法的执行上下文在原始方法的模块。

那么我怎样才能实现我想要做的,如我的代码片段中所示?请注意,我非常乐意将类变量替换为任何其他实现,例如使用实例变量,或者使其工作所需的任何实现:)。

4

1 回答 1

1

如果您将类变量查找作为方法调用的结果,它会起作用:

def typist
  puts self.class.class_variable_get(:@@name)
end

恐怕我对类变量不够熟悉,无法解释为什么它以这种方式工作,但不能以另一种方式工作。我确实知道类变量在 Ruby 世界中相对不受欢迎,主要是因为它们的行为可能无法预测。我的直觉是,由于您可以在模块中定义类变量(Module毕竟类继承自 ),因此引用模块中的变量会自动在该模块中搜索。将查找消息显式发送到您要发送到的实例的类:typist可确保找到正确的变量。

于 2013-05-22T18:45:17.800 回答