2008-10-02 12 views
9

Aşağıdaki Ruby modülünü hayal edin:Sınıfsız Modüllerde örnek yöntemlerin amacı nedir?

module Foo 
    def inst_method 
    puts "Called Foo.inst_method" 
    end 
    def self.class_method 
    puts "Called Foo.class_method" 
    end 
end 

Açıkça Foo.class_method herhangi bir sınıf örneği olmadan çağrılabilir. Ancak, Foo.inst_method'e ne oluyor? Daha önce bir sınıf dahil etmeden/genişletmeden Foo.inst_method'u aramak mümkün mü?

Sorumluluk reddi: Soru gerçek bir problemi çözmeye odaklanmadı. Sadece Ruby nesne sistemi hakkındaki anlayışımı geliştirmeye çalışıyorum.

cevap

12
0 verirmodülleri içinde örnek yöntemleri birincil amacı dahil sınıflara bu işlevselliği vermektir.

Bir modülün "karıştırılması", bu şekilde en yaygın olarak multiple inheritance benzetiminin bir yöntemi olarak veya mirasın doğru paradigma (tam olarak mükemmel değil "bir" ilişkidir) olduğu başka durumlarda kullanılır, ancak paylaşmak istediğinizde davranışı. Kodunuzu DRY tutmak için bir daha araç.

çekirdek Ruby, bunun iyi bir örneği, hem tüm tanımlanmıştır Her Enumerable modülü (each_with_index, select, reject, sort ve daha fazla bu işlevselliği elde vb seyahat ve sıralanabilir nasıl Array ve Hash olduğunu belirterek dahil modül, sınıflarda değil).

4
Benim cevabım olurdu

: "hayır öncelikle uzanan veya bir sınıfta bu modülü eklemeden modül örnek yöntemleri diyemezsin"

o olduğunu muhtemelen orada içeriyor

şimdi bilerek yakut ve tüm meta programlama kandırmaca bir şekilde aramak ancak modüllerin

module Tester 
    def inst_meth 
    puts "test inst meth\n" 
    end 

    def self.meth 
    puts "test self meth\n" 
    end 
end 

begin 
    Tester.meth 
rescue; 
    puts $! 
end 
begin 
    Tester.inst_meth 
rescue 
    puts $! 
end 
begin 
    Tester.new.inst_meth 
rescue 
    puts $! 
end 
begin 
    extend Tester 
    inst_meth 
rescue 
    puts $! 
end 
begin 
    include Tester 
    inst_meth 
rescue 
    puts $! 
end 

amaçlanan kullanıma dışında olacağını

>ruby test.rb 
test self meth 
undefined method `inst_meth' for Tester:Module 
undefined method `new' for Tester:Module 
test inst meth 
test inst meth