SORU
1 EKİM 2008, ÇARŞAMBA


Arasındaki fark vardır ve genişletmek Ruby nedir?

Sadece Ruby metaprogramming... kendisine dahil ederse/modülleri etrafında başımı almak her zaman beni şaşırtmak için yönetmek.

  • vardır: belirtilen modül yöntemleri olarak karıştırırörnek yöntemlerihedef sınıfında
  • uzatın: belirtilen modül yöntemleri olarak karıştırırsınıf yöntemlerihedef sınıfında

Çok büyük fark sadece bu veya daha büyük bir ejderha gözlemliyor? örneğin

module ReusableModule
  def module_method
    puts "Module Method: Hi there!"
  end
end

class ClassThatIncludes
  include ReusableModule
end
class ClassThatExtends
  extend ReusableModule
end

puts "Include"
ClassThatIncludes.new.module_method       # "Module Method: Hi there!"
puts "Extend"
ClassThatExtends.module_method            # "Module Method: Hi there!"

CEVAP
15 ŞUBAT 2011, Salı


uzatın- belirtilen modül bu yöntemler ve sabitler ekler hedefin metaclass (singleton sınıfı yani) örneğin

  • Klazz.extend(Mod), Klazz şimdi arayın Mod yöntemleri (sınıf yöntemleri) vardır
  • obj.extend(Mod), şimdi n ararsan Mod yöntemleri vardır (örnek yöntemleri gibi), ama obj.class başka bir örnek yöntemleri eklendi.
  • extend genel bir yöntemdir

vardır- Varsayılan olarak, hedef modül/sınıf örnek yöntemleri olarak belirtilen modül yöntemleri karıştırır. örneğin

  • eğer ararsan class Klazz; include Mod; end;, şimdi Klazz tüm örneklerini Mod yöntemlerine erişimi (örnek yöntemleri)
  • include konteyner sınıf/modül içinde olması için tasarlanmıştır çünkü özel bir yöntemdir.

Ancakçok sık modüllerigeçersiz kılarinclude'maymun-yama included yöntemi ile s davranış. Bu eski Raylar kod çok önemli. more details from Yehuda Katz.

Varsayılan davranış include hakkında daha fazla bilgi aşağıdaki kodu çalıştırın varsayıyorsun

class Klazz
  include Mod
end
  • Eğer Mod zaten Klazz, ya da onun atalarından biri dahil edilirse, bu açıklama bir etkisi vardır
  • Ayrıca Klazz Mod sabitler, çatışma yok sürece içerir
  • Mod modülü değişkenleri için Klazz erişim, *ör: 13* @@bar verir
  • eğer döngüsel eğer orada ArgumentError yükseltir içerir
  • Arayan yakın atası (yani ekler Klazz Mod.modülü ekler atalarımız, ama Mod Klazz zinciri eklenmez.üst sınıf.üst sınıf.üst sınıf. Yani, Klazz super#foo arama Klazz gerçek üst. foo yöntemi için kontrol etmeden önce Mod için#foo kontrol eder. Ayrıntılar.) RubySpec bakın.

Tabii ki, the ruby core documentation bu şeyleri yapmak için her zaman en iyi yer. The RubySpec project işlevi tam olarak onlar belgelenmiş çünkü aynı zamanda harika bir kaynak oldu.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BrandonHarrisWalker

    BrandonHarri

    27 Kasım 2006
  • EmperorTigerstar

    EmperorTiger

    14 EYLÜL 2009
  • Julian Smith

    Julian Smith

    31 EKİM 2006