2010-01-18 9 views
7

Bazı java servislerinden çok sayıda veri yükleyen bir ray uygulamasına sahibim. Bazı veri kutularını bu verilerle doldurmamı sağlayacak bir modül yazıyorum ve bunları düzgün bir şekilde eklemeye çalışıyorum. İşte benim modülü varYöntemlerin toplanması olarak yakut modülü

module FilterOptions 
    module Select 

    def some_select 
    return "some information" 
    end 
    end 
end 

Bu düşüncem application_helper içinde FilterOptions dahil etmek, ve ben o zaman bu durum böyle değil Select::some_select kullanarak Metotlarımı başvurmak düşündüm. include FilterOptions::Select'a ihtiyacım var, o zaman kendi başına some_select yöntemini referans alabilirim. Ben bunu istemiyorum ama sanırım, birisinin kendi modülümden some_select'un geldiğini bilemeyeceği biraz kafa karıştırıcı. Yani

, nasıl bu kadar benim ana modülü içerebilir kamu statik yöntemler gibi olduğu bir modülün yöntemleri yazmak ve içindeki modül yöntemleri tanımlarsanız Select::some_select

cevap

11

gibi alt modül isim kullanarak Metotlarımı başvuru yapmak modülün kendisinin bağlam, onlar ithalat olmadan çağrılabilir:

module FilterOptions 
    module Select 
    def self.some_select 
    return "some information" 
    end 
    end 
end 

puts FilterOptions::Select.some_select 
# => "some information" 

bir modülü almak değil, bir sonraki içe yerine ismiyle programa başvurmak mümkündür:

include FilterOptions 
puts Select.some_select 
# => "some information" 
"Modül fonksiyonu"

#!/usr/bin/ruby1.8 

module Foo 

    def foo 
    puts "foo" 
    end 
    module_function :foo 

end 

Foo.foo  # => foo 
Foo::foo  # => foo 

include Foo 
foo   # => foo 

Bazen bir olmak için bir modülde her yöntemi istiyorum ama yorucu olabilir:

+0

tamam biraz aptalca hissediyorum i sınıflarında kendini ile hep yapıyorsunuz, ben bilmiyorum. BTW Select :: some_select ve Select.some_select kullanımı arasındaki fark nedir? – brad

+0

Bu güzel bir soru. Sabitler söz konusu olduğunda, bir yöntem çağrısı olmadığı için :: notasyonu kullanmanız gerekir, ancak yöntemlerden birini kullanabileceğinizi düşünüyorum. – tadman

12

module_function bir modül fonksiyonu örnek yöntemi olarak veya modül fonksiyonu olarak ya çağrılabilir olmasına neden olur ve "module_function" deyip tekrar tekrar devam etmek için tekrarlayıcı. Bu durumda, sadece modül kendini uzatmak adres: ben bir modül farklı olacağını düşündüm neden

!/usr/bin/ruby1.8 

module Foo 

    extend self 

    def foo 
    puts "foo" 
    end 

end 

Foo.foo  # => foo 
Foo::foo  # => foo 

include Foo 
foo   # => foo 
+0

hey geç cevap için üzgünüm, detaylar için teşekkürler, sadece meta programlamayı öğreniyorum, şimdi bunu araç kutusuna ekleyeceğim! – brad

+0

Rica ederim. Mutlu Hacking! –