Dahil olmadan Ruby modülü üzerinde bir örnek yöntemi çağırmak miyim?
Arka plan:
Örnek bir dizi yöntem tanıtan bir modül var
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
Ve bir sınıf içinde bu yöntemlerden bazıları aramanı istiyorum. Normalde ruby'de bunu nasıl bu şekilde
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
Sorun
include UsefulThings
getiriyortümUsefulThings
yöntemleri. Bu durumda ben sadece format_text
açıkça get_file
delete_file
ister istemez.
Bu birkaç olası çözüm görebiliyorum:
- Nedense yöntemi modülü üzerinde doğrudan herhangi bir yere dahil olmadan çağırmak
- Eğer bu yapılabilir ise nasıl bilmiyorum. (Bu soru dolayısıyla)
- Bir şekilde
Usefulthings
vardır ve sadece bu yöntemlerden bazıları getirin- Ben de bu yapılabilir eğer/nasıl yapacağımı bilmiyorum
- Bir proxy sınıf oluşturmak,
UsefulThings
vardır, proxy örneğiformat_text
havale et- Bu iş, ancak proxy sınıfları anonim bir hack. İğrenç.
- 2 Modül veya daha küçük modülleri ayrıldı
- Bu da iş, ve muhtemelen en iyi çözüm belki, ama tercih ederdim bunu önlemek için hazırım sonuna kadar bir çoğalma düzinelerce modül yönetimi bunun külfetli
Neden tek bir modülde ilgisiz işlevleri vardır? ApplicationHelper
bizim takım de-facto olan bir rails uygulaması, herhangi bir şey için damping zemin olarak karar üzerinde yeterince spesifik başka bir yere ait. Çoğunlukla her yerde kullanılan bu yardımcı program yöntemleri tek başına. Bu ayrı yardımcıları içine kırabilirim ama 1 yöntem ile her... bu verimsiz görünüyor hepsi 30 olur
CEVAP
Eğer bir modül bir yöntem modülünün bir fonksiyonu haline ise basit olarak ilan edilmişti sanki makamların iptal edebilirsiniz
module Mods
def self.foo
puts "Mods.foo(self)"
end
end
Module_function yaklaşım aşağıda Modlar hepsi dahil tüm sınıfları kesmemek.
module Mods
def foo
puts "Mods.foo"
end
end
class Includer
include Mods
end
Includer.new.foo
Mods.module_eval do
module_function(:foo)
public :foo
end
Includer.new.foo # this would break without public :foo above
class Thing
def bar
Mods.foo
end
end
Thing.new.bar
Ancak, ilgisiz işlevler kümesi ilk etapta aynı modül içinde yer alan her neden merak ediyorum?
Düzenlenmişbu içerir göstermek için public :foo
module_function :foo
sonra çağrılırsa hala çalışıyor
Nasıl bir modülü başlatılamıyor'r...
Raylar üzerinde Ruby belirleyici bir y...
Nasıl kullanılır "&; raylar üzeri...
Nasıl yazılır olmadan iki sağlamaların...
C# Varlık-Çerçeve: Nasıl birleştirebil...