2013-02-23 3 views
3

Так что я недавно начал писать некоторые Ruby, и пока я понимаю, как работают модули, следующее поведение меня отбрасывает.Понимание поведения модулей Ruby

module ModuleA 
    def a_greet 
     'Hello from module A' 
    end 
end 


module ModuleB 
    def b_greet 
     'Hello from module B' 
    end 
end 


include ModuleA 
include ModuleB 

# WHY DOES THIS WORK !!!!! 
p ModuleA.b_greet 

Я понимаю, что функции из модулей можно назвать без указания Module. и что я никогда не писать код таким образом, но я не могу понять, почему вы можете вызвать метод включен из ModuleB при явном указании ModuleA ?

ответ

7

Подождите, есть больше:

"Why does this work?".b_greet # => "Hello from module B" 

Вы в том числе тех модулей в объекте верхнего уровня main. Это специальный объект: все методы, определенные на нем, становятся доступными для всех объектов (см. Приведенную выше строку, теперь есть метод b_greet на String). ModuleA - тоже объект, поэтому, когда вы включаете ModuleB, ModuleA получает свои методы. Если вы включите эти модули в обычный класс/объект, вы не получите это «совместное» поведение.

+0

Интересно .. Спасибо. – RayViljoen

Смежные вопросы