2

我试图用类变量来理解模块包含。我认为包含一个带有类变量的模块也会将类变量包含到类定义中。

这按预期工作:

module A 
  @@my_name = "rick"
  def print_name
    puts @@my_name
  end
end

class Y 
  include A
  extend A
end

Y.print_name

但这不会:

module A

  def self.included(klass)
    klass.include B
    klass.extend C
  end

  module B
    @@my_name = "bob"
  end

  module C 
    def print_name
      puts @@my_name
    end
  end

end

class Y
  include A
end

Y.print_name

我期待“鲍勃”,但我得到了:

A::C 中未初始化的类变量 @@my_name

4

2 回答 2

1

如果您使用Module#class_variable_get,它将起作用:

module C
  def print_name
    class_variable_get(:@@my_name)
  end
end
Y.print_name
#=> "bob"

我认为问题在于,当module C您说它puts @@my_name还不知道 时@@my_name,因为module C您从未设置它(它已设置module BC不知道B)。

于 2016-12-15T06:02:41.030 回答
-1

如果您尝试添加模块怎么办?这会将模块添加到类中,但将它们插入到类的方法之前。这是一种确保如果存在变量命名冲突,模块将胜出的方法。

我的意思更多是作为评论,但我的用户评分还不够高,无法发表评论,所以如果这不合时宜,我深表歉意。

于 2016-12-15T03:01:29.097 回答