Предположим, у меня есть следующее:
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
? Похоже, что использование заглавных букв в имени переменной — это больше, чем просто соглашение. - Когда
include
ing модуль, какие вещи передаются включенному классу и в какой области? - Есть ли способ сделать наоборот? То есть использовать include для включения переменной экземпляра или метода класса?
def self.hello_world...
, чтобы получитьMyModule::SubModule.hello_world => "hello world!"
. Кроме того, вы можете оставитьhello_world
методом экземпляра и добавить строкуextend self
в концеSubModule
, чтобы сделатьhello_world
методом модуля (а также методом экземпляра). - person Cary Swoveland   schedule 10.03.2016