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

时间:2016-03-09 23:28:02

标签: ruby module scope instance-variables class-variables

假设我有以下内容:

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 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似乎已成为hello_world实例方法!也就是说,initialize中对self.cool_method的调用有效,但Var中的调用却没有。这很奇怪,考虑到MyClass::Var x = MyClass.new x.hello_world 似乎已被包含为类变量,因为在类之外,我必须像这样访问它们:

Var

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

  1. 关于var vs include的幕后情况如何?看来,将变量名称大写不仅仅是一种约定。
  2. Schema模块时,传递给包含类的内容以及范围是什么?
  3. 有没有办法做相反的事情?也就是说,使用include来包含实例变量或类方法?

1 个答案:

答案 0 :(得分:3)

  

关于Var vs var的幕后情况如何?似乎大写变量名称不仅仅是一个约定。

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

  

include模块时,传递给包含类的内容以及范围是什么?

什么都没有传递到任何地方。 include一个mixin只是在你include类的超类中混合。这就是全部。然后其他所有内容都与类完全一样。

  

有没有办法做相反的事情?也就是说,使用include来包含实例变量或类方法?

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

没有"类方法"在Ruby中。 Ruby只知道一种方法:实例方法。当Rubyists彼此交谈时,他们有时会使用术语"类方法"意思是"恰好是一个类的对象的单例方法"但是他们完全知道类方法实际上并不存在,它只是对话中的简写。 (当然,单身方法也不存在,它们只是一种方便的方式来表达单身类的实例方法"。)