2009-12-29 3 views
15

У меня есть следующий код на Ruby:Вызов метода на модуле Ruby,

module MyModule 
    class MyClass 
    def self.my_method 
    end 
    end 
end 

Чтобы позвонить my_method, я вхожу MyModule::MyClass.my_method. Я хотел бы написать обертку для my_method на самом модуле:

MyModule.my_method 

Возможно ли это?

ответ

13

Простой метод:

module MyModule 
    def self.my_method(*args) 
    MyModule::MyClass.my_method(*args) 
    end 
end 

Harder метод:

Используйте метапрограммированием написать функцию для всех случаев (например, attr_accessor).

+0

Я думаю, теперь я знаю, почему это не сработало: у меня было объявление MyModule.my_method в одном файле (my_module.rb) и MyModule :: MyClass.my_method в другом файле (my_class.rb). Когда я поставил вышеуказанный метод внутри my_class.rb, MyModule.my_method работал! – gsmendoza

+0

Простой способ: требует «пересылки». –

8

Вы можете определить метод непосредственно внутри модуля.

module MyModule 
    def self.my_method 
    puts "Hi I am #{self}" 
    end 
end 

MyModule.my_method #=> Hi I am MyModule 
27

Я не уверен, чего вы пытаетесь достичь, но: если вы сделаете его обычным методом и измените его с помощью module_function, вы сможете назвать его любым способом, который вы выберете.

#!/usr/bin/ruby1.8 

module MyModule 

    def my_method 
    p "my method" 
    end 
    module_function :my_method 

end 

Сделав это, вы можете включить либо модуль и вызвать метод как метод экземпляра:

class MyClass 

    include MyModule 

    def foo 
    my_method 
    end 

end 

MyClass.new.foo  # => "my method" 

или вы можете вызвать метод как метод класса на модуле:

MyModule.my_method # => "my method" 
+0

В вашем случае вы можете назвать свой метод на своем модуле? Вам не нужно, чтобы я стоял перед my_method? – Jwan622

+1

@ Jwan622 Я попытался улучшить свой ответ. Отвечает ли он на ваш вопрос сейчас? –

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