2009-12-29 22 views
15

üzerinde bir yöntemi çağırma:Aşağıdaki Ruby koduna sahip bir Ruby modülü

module MyModule 
    class MyClass 
    def self.my_method 
    end 
    end 
end 

aramak için my_method, ben MyModule::MyClass.my_method girin. Bu mümkün mü

MyModule.my_method 

: Ben modül kendisinde my_method için bir sarıcı yazmak istiyorum?

cevap

13

basit yöntem:

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

Harder yöntemi:

Kullanım metaprogramming (attr_accessor gibi) tüm durumlar için bir fonksiyon yazmak için.

+0

Şimdi neden daha önce çalışmadığını biliyorum: Ben bir dosya (my_module.rb) ve başka bir dosyada (my_class.rb) MyModule :: MyClass.my_method MyModule.my_method beyanı vardı. Yukarıdaki yöntemi my_class.rb içine koyduğumda, MyModule.my_method çalıştı! – gsmendoza

+0

Daha kolay yol: 'zorlabilir' gerektirir. –

8

Yöntemi doğrudan modülün içinde tanımlayabilirsiniz.

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

MyModule.my_method #=> Hi I am MyModule 
27

Neyi başarmaya çalıştığınızdan emin değilim, ancak: eğer düzenli bir yöntem yaparsanız ve onu module_function ile değiştirirseniz, onu istediğiniz şekilde çağırabilirsiniz.

#!/usr/bin/ruby1.8 

module MyModule 

    def my_method 
    p "my method" 
    end 
    module_function :my_method 

end 

Bunu yaptıktan sonra, ya modülünü içerir ve örnek yöntemi olarak yöntemini çağırabilir:

class MyClass 

    include MyModule 

    def foo 
    my_method 
    end 

end 

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

veya modülünde bir sınıf yöntemi olarak yöntemini çağırabilir:

+0

Sizin durumunuzda, yönteminizi modülünüzde arar mısınız? My_method'un önünde kendine ihtiyacın yok mu? – Jwan622

+1

@ Jwan622 Cevabımı geliştirmeye çalıştım. Şimdi sorunuza cevap veriyor mu? –