SORU
26 Kasım 2008, ÇARŞAMBA


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:

  1. 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)
  2. 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
  3. Bir proxy sınıf oluşturmak, UsefulThings vardır, proxy örneği format_text havale et
    • Bu iş, ancak proxy sınıfları anonim bir hack. İğrenç.
  4. 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
26 Kasım 2008, ÇARŞAMBA


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Megan Parken

    Megan Parken

    19 Temmuz 2009
  • Shameless Maya

    Shameless Ma

    24 Mayıs 2012
  • SuicideSheeep

    SuicideSheee

    8 Ocak 2012