红宝石模块包含和类变量



我正在尝试了解具有类变量的模块包含物。我认为包括具有类变量的模块也将包括类变量到类定义中。

这是按预期工作的:

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

如果您使用模块# 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)。

如果您尝试预处模块怎么办?这将一个模块添加到一类,但在班级的方法之前插入它们。这是确保如果存在可变命名冲突的一种方法,则模块将赢得胜利。

,我的意思是更多地作为评论,但是我的用户评级还不够高,因此,如果这不在意,我深表歉意。

相关内容

  • 没有找到相关文章

最新更新