ruby 模块包含的变量和方法的范围是什么?

What is the scope of variables and methods included via ruby modules?

假设我有以下内容:

module MyModule
  module SubModule
    Var = 'this is a constant'
    var = 'this is not a constant'
    def hello_world
      return 'hello world!'
    end
  end
end

在同一个文件中,我似乎只能访问MyModule::SubModule::Var,但不能访问任何常量或方法。如果我现在创建一个 class 并以不同的方式包含这些模块,我会得到额外的奇怪行为:

class MyClass
  include MyModule
  def initialize()
    puts SubModule::Var
  end

  def self.cool_method
    puts SubModule::Var
  end
end

在这种情况下,我再次只能访问 Var,而不能访问其他两个。 SubModule::varSubModule::hello_world 不起作用。最后:

class MyClass
  include MyModule::SubModule
  def initialize()
    puts Var
    puts hello_world
  end
  def self.cool_method
    puts Var
    puts hello_world
  end
end

在这种情况下,我现在可以访问 Var 和方法 hello_world 但不能访问 var,而且,最奇怪的是 hello_world 似乎都变成了实例方法!也就是说,initialize 中对 hello_world 的调用有效,但 self.cool_method 中的调用无效。这很奇怪,考虑到 Var 似乎已作为 class 变量包含在内,因为在 class 之外,我必须像这样访问它们:

MyClass::Var
x = MyClass.new
x.hello_world

所以,我有几个主要问题。

  1. Varvar 的幕后情况如何?看来,变量名大写毕竟不仅仅是一种约定俗成。
  2. includeing 一个模块时,什么样的东西被传递给包含 class,在什么范围?
  3. 有没有相反的方法?即使用include来包含一个实例变量或者一个class方法?

What is going on behind the scenes with regards to Var vs var? It appears that capitalizing a variable name is more than just a convention after all.

是的,当然,这不是惯例。以大写字母开头的变量是常量,以小写字母开头的变量是局部变量。两者完全不同。

When includeing a module, what kinds of things are passed to the including class, and at what scope?

任何地方都不会传递任何东西。 includeing 一个 mixin 只是使那个 mixin 成为你正在 include 进入的 class 的 superclass。就这样。其他一切都与 classes.

完全一样

Is there a way to do the opposite? That is, use include to include an instance variable or a class method?

我不明白这个问题。实例变量与 mixins 或 classes 无关。它们属于实例,这就是为什么它们被称为 "instance" 变量。

Ruby中没有"class methods"这样的东西。 Ruby只知道一种方法:实例方法。当 Rubyists 互相交谈时,他们有时会使用术语 "class method" 来表示 "singleton method of an object that happens to be a class",但他们这样做时非常清楚 class 方法实际上并不存在, 这只是一个 shorthand 的对话。 (当然,单例方法也不存在,它们只是一种方便的说法 "instance method of the singleton class"。)