假设我有以下内容:
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::var
和SubModule::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
所以,我有几个主要问题。
var
vs include
的幕后情况如何?看来,将变量名称大写不仅仅是一种约定。Schema
模块时,传递给包含类的内容以及范围是什么?答案 0 :(得分:3)
关于Var vs var的幕后情况如何?似乎大写变量名称不仅仅是一个约定。
是的,当然,这不是一个惯例。以大写字母开头的变量是常量,以小写字母开头的变量是局部变量。两者完全不同。
当
include
模块时,传递给包含类的内容以及范围是什么?
什么都没有传递到任何地方。 include
一个mixin只是在你include
类的超类中混合。这就是全部。然后其他所有内容都与类完全一样。
有没有办法做相反的事情?也就是说,使用include来包含实例变量或类方法?
我不明白这个问题。实例变量与mixins或类无关。它们属于实例,这就是为什么它们被称为"实例"变量
没有"类方法"在Ruby中。 Ruby只知道一种方法:实例方法。当Rubyists彼此交谈时,他们有时会使用术语"类方法"意思是"恰好是一个类的对象的单例方法"但是他们完全知道类方法实际上并不存在,它只是对话中的简写。 (当然,单身方法也不存在,它们只是一种方便的方式来表达单身类的实例方法"。)