SORU
30 Temmuz 2010, Cuma


Nasıl bir uyarı olmadan bir Ruby sürekli yeniden tanımlamak için?

Ruby bir dosya her zaman tarih değişiklikleri değerlendirmeler bazı Ruby kod koşuyorum. Bu dosya, sabit tanımlar, gibi

Tau = 2 * Pi

ve, tabii ki, onlar tercüman istenmeyen "zaten sürekli" her zaman Uyarı, Bu yüzden, aşağıdaki işlevleri yapmak istiyorum: . başlatıldı ekran olun

def_if_not_defined(:Tau, 2 * Pi)
redef_without_warning(:Tau, 2 * Pi)

Böyle sürekli benim tanımları yazarak uyarı uzak dururdum:

Tau = 2 * Pi unless defined?(Tau)

ama çok kaba ve biraz ıslak (DRY).

Daha iyi bir yol 10 ** var mı? Ve nasıl redef_without_warning?

--

Steve çözüm için teşekkürler

class Object
  def def_if_not_defined(const, value)
    mod = self.is_a?(Module) ? self : self.class
    mod.const_set(const, value) unless mod.const_defined?(const)
  end

  def redef_without_warning(const, value)
    mod = self.is_a?(Module) ? self : self.class
    mod.send(:remove_const, const) if mod.const_defined?(const)
    mod.const_set(const, value)
  end
end

A = 1
redef_without_warning :A, 2
fail 'unit test' unless A == 2
module M
  B = 10
  redef_without_warning :B, 20
end
fail 'unit test' unless M::B == 20

--

Bu soru eski. Yukarıdaki kod sadece Ruby 1.8 için gereklidir. Ruby 1.9, P3t3rU5 cevabı hiçbir uyarı üretir ve sadece daha iyi olur.

CEVAP
31 Temmuz 2010, CUMARTESİ


Aşağıdaki modül ne istiyorsun olabilir. Çözüm için bazı öneriler verebilir

module RemovableConstants

  def def_if_not_defined(const, value)
    self.class.const_set(const, value) unless self.class.const_defined?(const)
  end

  def redef_without_warning(const, value)
    self.class.send(:remove_const, const) if self.class.const_defined?(const)
    self.class.const_set(const, value)
  end
end

Ve bunu basit bir örnek olarak

class A
  include RemovableConstants

  def initialize
    def_if_not_defined("Foo", "ABC")
    def_if_not_defined("Bar", "DEF")
  end

  def show_constants
    puts "Foo is #{Foo}"
    puts "Bar is #{Bar}"
  end

  def reload
    redef_without_warning("Foo", "GHI")
    redef_without_warning("Bar", "JKL")
  end

end

a = A.new
a.show_constants
a.reload
a.show_constants

Aşağıdaki çıktıyı verir

Foo is ABC
Bar is DEF
Foo is GHI
Bar is JKL

Eğer hala Ruby içinde Modül:Sınıfı:Eigenclass yapısı kafamı olarak burada herhangi bir ruby tabular kırdım beni affet

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bokeh

    Bokeh

    9 HAZİRAN 2014
  • MADFINGER Games a.s.

    MADFINGER Ga

    21 NİSAN 2009
  • SoundHound

    SoundHound

    8 Mart 2006