Sorum " Ruby'de include ve expand arasındaki fark nedir? "
Ruby'de require
ve include
Ruby arasındaki fark nedir ? Sınıfımdaki bir modülün yöntemlerini kullanmak istersem, yapmalı mıyım require
yoksa yapmalı mıyım include
?
Sorum " Ruby'de include ve expand arasındaki fark nedir? "
Ruby'de require
ve include
Ruby arasındaki fark nedir ? Sınıfımdaki bir modülün yöntemlerini kullanmak istersem, yapmalı mıyım require
yoksa yapmalı mıyım include
?
Yanıtlar:
Ruby'de "içerme" ve "gerektirme" arasındaki fark nedir?
Cevap:
Dahil etme ve isteme yöntemleri çok farklı şeyler yapar.
Require yöntemi, diğer programlama dillerinde bulunanların çoğunu yapar: başka bir dosya çalıştırın. Ayrıca geçmişte nelere ihtiyaç duyduğunuzu da izler ve aynı dosyayı iki kez gerektirmez. Bu ek işlevsellik olmadan başka bir dosya çalıştırmak için load yöntemini kullanabilirsiniz.
İnclude yöntemi tüm yöntemleri başka bir modülden alır ve bunları geçerli modüle ekler. Bu, dil düzeyinde olduğu gibi dosya düzeyinde bir şeyin aksine, dil düzeyinde bir şeydir. Dahil etme yöntemi, sınıfları diğer modüllerle (genellikle karma olarak adlandırılır) "genişletmenin" birincil yoludur. Örneğin, sınıfınız "each" yöntemini tanımlıyorsa, Enumerable mixin modülünü dahil edebilirsiniz ve bu bir koleksiyon görevi görebilir. İçerme fiili diğer dillerde çok farklı kullanıldığı için bu kafa karıştırıcı olabilir.
Dolayısıyla, bir modülü genişletmek veya bir mix yapmak yerine kullanmak istiyorsanız, o zaman kullanmak istersiniz require
.
Garip, Ruby'nin require
C'ler benzerdir include
Ruby'nin iken, include
neredeyse C'ler benzemiyor include
.
include
Ruby'de sadece miras. class C; include M end
yapar M
ve üst sınıfı C
ve (eski) üst sınıf C
bir üst sınıfı M
. C'nin include
miras yoluyla çalıştığını düşünmüyorum, bence basit metinsel / sözcüksel ikame.
Bir modül kullanıyorsanız, bu, tüm yöntemleri sınıfınıza getirdiğiniz anlamına gelir. Eğer extend
modüllü bir sınıfsanız, modülün yöntemlerini sınıf yöntemi olarak "getirdiğiniz" anlamına gelir . Eğer include
modüllü bir sınıfsanız bu, modülün yöntemlerini örnek yöntem olarak "getirdiğiniz" anlamına gelir .
EX:
module A
def say
puts "this is module A"
end
end
class B
include A
end
class C
extend A
end
B.say
=> B: Sınıf için tanımsız yöntem 'say'
B.new.say
=> bu modül A
C.say
=> bu modül A
C.new.say
=> C: Sınıfı için tanımsız yöntem 'say'
Metaprogramming Ruby kitabından,
require()
Yöntem oldukça benzerload()
, ancak farklı bir amaç için içindir. Kullanılacakload()
kodu çalıştırmak için ve kullanmakrequire()
kütüphaneleri ithal etmek.
Ruby require
daha çok diğer dillerde "dahil" gibidir (C gibi). Ruby'ye başka bir dosyanın içeriğini getirmek istediğinizi söyler . Diğer dillerdeki benzer mekanizmalar şunlardır:
Ruby include
, mixins için kullanılan nesne yönelimli bir miras mekanizmasıdır .
Burada iyi bir açıklama var :
Basit cevap, gereksinim ve içermenin esasen ilgisiz olmasıdır.
"gerektirir" acemi karışıklığa neden olabilir C içerir benzer. (Dikkate değer bir fark, ihtiyaç duyulduğunda gerekli dosyanın içindeki yerlilerin "buharlaşması" dır.)
Ruby dahil C dahil gibi bir şey değildir. İnclude deyimi bir modülü sınıfa "karıştırır". Bu bir var çoklu kalıtımın sınırlı formu . Dahil edilen bir modül, kelimenin tam anlamıyla onun dahil olduğu şey üzerinde bir "is-a" ilişkisine bahşeder.
Vurgu eklendi.
Hiç require
bir modül denediniz mi? Sonuçlar neydi? Sadece dene:
MyModule = Module.new
require MyModule # see what happens
Modüller gerekli değildir, sadece dahil!
TypeError
, kelime Module
olarak değiştirilirse aynı sonucu ( ) aldıklarını görür Class
.
Programlama Ruby 1.9 itibaren
Devam etmeden önce include ifadesi hakkında birkaç noktaya değineceğiz. İlk olarak, dosyalar ile ilgisi yoktur. C programcıları derleme sırasında bir dosyanın içeriğini diğerine eklemek için #include adlı bir önişlemci yönergesi kullanır. Ruby include deyimi bir modüle başvuruda bulunur. Bu modül ayrı bir dosyadaysa, include'u kullanmadan önce dosyayı sürüklemek için requir (ya da daha az kullanılan kuzeni, load) kullanmanız gerekir. İkincisi, Ruby içerme, modülün örnek yöntemlerini sınıfa kopyalamakla kalmaz. Bunun yerine, sınıftan dahil edilen modüle bir başvuru yapar. Birden fazla sınıf bu modülü içeriyorsa, hepsi aynı şeye işaret eder. Programınız çalışırken bile bir modül içindeki yöntemin tanımını değiştirirseniz,
Ekle Aşağıda gösterildiği gibi sınıfınıza bir modül eklediğinizde, modül içinde tanımlanan kodu alıp 'dahil ettiğiniz' sınıf içine eklediniz. 'Karıştırma' davranışına izin verir. Örneğin, modül içinde aynı koda ihtiyaç duyacak birden fazla sınıf varsa, çoğaltmayı önlemek için kodunuzu KURUTMAK için kullanılır.
Load (Yükle) Load (Yük) yöntemi, kütüphanenin yüklenip yüklenmediğini izlememesi dışında neredeyse bir yöntemdir. Bu nedenle, bir kitaplığı birden çok kez yüklemek mümkündür ve ayrıca yükleme yöntemini kullanırken kitaplık dosya adının “.rb” uzantısını belirtmeniz gerekir.
Zorunlu Zorunlu yöntem, bir kitaplığı yüklemenize olanak tanır ve birden çok kez yüklenmesini önler. Aynı kitaplığı ilk kez yüklemeye çalışırsanız, requir yöntemi 'false' değerini döndürür. Zorunlu yöntemin yalnızca, yüklediğiniz kitaplık ayrı bir dosyada tanımlanması durumunda kullanılmalıdır; bu genellikle durumdur.
Bunu http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/ tercih edebilirsiniz.
Aşağıda, gereksinim ve dahil etme arasında birkaç temel fark vardır:
gerektir:
Dahil etmek:
require(name)
Bolean true / false döndürecek
Gereksinim için parametre olarak iletilen ad, ruby, yükleme yolunuzda bu ada sahip kaynak dosyayı bulmaya çalışır. Aynı kitaplığı ilk kez yüklemeye çalışırsanız, requir yöntemi 'false' değerini döndürür. Zorunlu yöntemin yalnızca yüklediğiniz kitaplık ayrı bir dosyada tanımlanmış olması durumunda kullanılması gerekir. Böylece bu kütüphanenin önceden yüklenmiş olup olmadığını takip eder.
include module_name
İki farklı sınıfta olması gereken bazı yöntemleriniz varsa varsayalım. O zaman onları her iki sınıfta da yazmak zorunda değilsiniz. Bunun yerine bunu modülde tanımlayın. Ve sonra bu modülü diğer sınıflara dahil edin. Sadece KURU prensibini sağlamak için Ruby tarafından sağlanır. Çoğaltmayı önlemek için kodunuzu KURUTMAK için kullanılır
Dahil etmek
Ne zaman sana
include
sen modülü içinde tanımlanan kod aldı ve bunu 'include' sınıfına, içinde bunu takılıysa gibi sınıfa bir modül, bu kadar. 'Karıştırma' davranışına izin verir. Örneğin, modül içinde aynı koda ihtiyaç duyacak birden fazla sınıf varsa, çoğaltmayı önlemek için kodunuzu KURUTMAK için kullanılır.
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
include Log
# ...
end
tc = TestClass.new.class_type # -> success
tc = TestClass.class_type # -> error
gerektir
Zorunlu yöntem, bir kitaplığı yüklemenize olanak tanır ve birden çok kez yüklenmesini önler. Aynı kitaplığı ilk kez yüklemeye çalışırsanız, requir yöntemi 'false' değerini döndürür. Zorunlu yöntemin yalnızca, yüklediğiniz kitaplık ayrı bir dosyada tanımlanması durumunda kullanılmalıdır; bu genellikle durumdur.
Böylece bu kütüphanenin önceden yüklenmiş olup olmadığını takip eder. Ayrıca kitaplık dosya adının “.rb” uzantısını belirtmeniz gerekmez. Gereksinimin nasıl kullanılacağına dair bir örnek. Require yöntemini “.rb” dosyanızın en üstüne yerleştirin:
Yük
Bu yöntem kitaplığın yüklenip yüklenmediğini izlememesi dışında load yöntemi neredeyse Require yöntemine benzer. Bu nedenle, bir kitaplığı birden çok kez yüklemek mümkündür ve ayrıca yükleme yöntemini kullanırken kitaplık dosya adının “.rb” uzantısını belirtmeniz gerekir.
uzatmak
İçerme yerine uzatma yöntemini kullanırken, modülün yöntemlerini örnek yöntemler yerine sınıf yöntemleri olarak eklersiniz.
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
extend Log
# ...
end
tc = TestClass.class_type
'Yükle' - bir dosyanın içeriğini ekler. (Dosya her çağrıldığında dosyayı ayrıştır)
'Gerekli' - dosya ayrıştırılmış içerik ekler. (Dosya bir kez ayrıştırıldı ve bellekte saklandı)
'Ekle' - modülü sınıfa dahil eder ve modülün içindeki yöntemleri sınıfın örnek yöntemi olarak kullanabilir
'Genişlet' - modülü sınıfa dahil eder ve modül içindeki yöntemleri sınıf yöntemi olarak kullanabilir
require
veinclude
alakalı zamanda ve,Module#append_features
.