2013-12-21 4 views
0

Я определил метод, в котором есть несколько классов внутри него и несколько модулей. Из одного из классов я пытаюсь вызвать метод, который определен в модуле (внутри общего), и я получаю ошибку доступа. Вот полная иерархия:В чем проблема с приемом метода в цепочке предков в Ruby

module Top 
class NestedClass 
    #some code 
    NestedModule::method_name 
end 

module NestedModule 
    def method_name 
    #some code 
    end 
end 
end 

И ошибка, что я получаю: не определен метод 'method_name' для Top :: NestedModule: Модуль

ответ

0

написать:

module Top 
    module NestedModule 
    def self.method_name 
     #some code 
    end 
    end 
    class NestedClass 
    #some code 
    NestedModule::method_name 
    end 
end 

В в вашем случае вы сделали NestedModule::method_name перед определением модуля NestedModule.

+0

Что делать, если я определяю его вне модуля Top и просто включаю его в класс (NestedClass), где он действительно нужен? – user2128702

+0

@ user2128702 Я не получил вас –

+0

Я пробовал свой путь, но получаю точно такой же NoMethodError. Я не знаю, почему. – user2128702

0

Вы не можете напрямую вызвать необъявленные методы, а также методы модуля экземпляра. Может быть, это будет убрать вещи для вас:

module Top 
    module NestedModule 
    def self.module_method 
     1 
    end 

    def instance_method 
     2 
    end 
    end 

    class NestedClass 
    NestedModule.module_method # => 1 
    NestedModule.instance_method(:instance_method) # => #<UnboundMethod: Top::NestedModule#instance_method> 

    extend NestedModule 
    instance_method # => 2 

    include NestedModule 
    new.instance_method # => 2 
    end 
end 

И хотя «NestedModule :: module_method» также будет работать здесь, конвенция является использование точек при вызове методов класса/модуля, и двойные колоны при доступе вложенных модулей/классы.

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

  • Нет связанных вопросов^_^