Ruby模块包含和类变量

时间:2016-12-15 00:18:09

标签: ruby module mixins class-variables inclusion

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

符合预期:

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

我期待“ bob ”,但我得到了:

  

A :: C

中未初始化的类变量@@ my_name

2 个答案:

答案 0 :(得分: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 B中设置,C不知道B)。

答案 1 :(得分:-1)

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

我的意思是这更像是一个评论,但我的用户评价还不够高,所以我很抱歉,如果这不符合标准。