Eşitlik operatörleri: == ve! =
Eşitlik veya çift eşitlik olarak da bilinen == işleci, her iki nesne de eşitse true, değilse yanlış döndürür.
"koan" == "koan" # Output: => true
Eşitsizlik olarak da bilinen! = İşleci == ifadesinin tersidir. Her iki nesne de eşit değilse true, eşitse false döndürür.
"koan" != "discursive thought" # Output: => true
Farklı bir sırayla aynı öğelere sahip iki dizinin eşit olmadığını, aynı harfin büyük ve küçük sürümlerinin eşit olmadığını unutmayın.
Farklı türdeki sayıları (örneğin, tamsayı ve kayan nokta) karşılaştırırken, sayısal değerleri aynı ise, == true değerini döndürür.
2 == 2.0 # Output: => true
eşit?
Her iki işlenenin de eşit olup olmadığını sınayan == işlecinin aksine, eşit yöntem iki işlenenin aynı nesneyi gösterip göstermediğini denetler. Bu Ruby'deki en katı eşitlik şeklidir.
Örnek: a = "zen" b = "zen"
a.object_id # Output: => 20139460
b.object_id # Output :=> 19972120
a.equal? b # Output: => false
Yukarıdaki örnekte, aynı değere sahip iki dizemiz var. Ancak, bunlar farklı nesne kimlikleri olan iki ayrı nesnedir. Peki, eşit mi? yöntemi false değerini döndürür.
Tekrar deneyelim, sadece bu sefer b a'ya bir referans olacaktır. Nesne tanıtıcısının, aynı nesneyi işaret ettiklerinden, her iki değişken için de aynı olduğuna dikkat edin.
a = "zen"
b = a
a.object_id # Output: => 18637360
b.object_id # Output: => 18637360
a.equal? b # Output: => true
EQL?
Hash sınıfında, eql? yöntemi anahtarları eşitlik açısından test etmek için kullanılır. Bunu açıklamak için biraz arka plan gereklidir. Genel bilgi işlem bağlamında, bir karma işlevi herhangi bir boyutta bir dize (veya bir dosya) alır ve genellikle yalnızca karma olarak adlandırılan karma kod adı verilen sabit boyutlu bir dize veya tam sayı oluşturur. Yaygın olarak kullanılan bazı karma kod türleri MD5, SHA-1 ve CRC'dir. Şifreleme algoritmalarında, veritabanı indekslemesinde, dosya bütünlüğü kontrolünde vb. Kullanılırlar. Ruby gibi bazı programlama dilleri, karma tablosu adı verilen bir toplama türü sağlar. Karma tablolar, benzersiz anahtarlar ve karşılık gelen değerlerden oluşan verileri çiftler halinde depolayan sözlük benzeri koleksiyonlardır. Kaputun altında, bu anahtarlar hashcode olarak saklanır. Karma tablolar genellikle karma olarak adlandırılır. Hash kelimesinin bir karma koduna veya bir karma tablosuna nasıl başvurduğuna dikkat edin.
Ruby, karma kodlar oluşturmak için karma adı verilen yerleşik bir yöntem sağlar. Aşağıdaki örnekte, bir dize alır ve bir hashcode döndürür. Aynı değere sahip dizelerin, farklı nesneler olsa da (farklı nesne kimlikleriyle) her zaman aynı karma koduna sahip olduğuna dikkat edin.
"meditation".hash # Output: => 1396080688894079547
"meditation".hash # Output: => 1396080688894079547
"meditation".hash # Output: => 1396080688894079547
Karma yöntemi, tüm Ruby nesnelerinin varsayılan kökü olan Object sınıfında bulunan Çekirdek modülünde uygulanır. Symbol ve Integer gibi bazı sınıflar varsayılan uygulamayı kullanır, String ve Hash gibi diğerleri kendi uygulamalarını sağlar.
Symbol.instance_method(:hash).owner # Output: => Kernel
Integer.instance_method(:hash).owner # Output: => Kernel
String.instance_method(:hash).owner # Output: => String
Hash.instance_method(:hash).owner # Output: => Hash
Ruby'de, bir şeyi bir karma (koleksiyon) içinde sakladığımızda, anahtar olarak sağlanan nesne (ör., Dize veya simge) bir karma kod olarak dönüştürülür ve saklanır. Daha sonra, bir öğeyi karma (koleksiyon) öğesinden alırken, bir nesneyi bir anahtar olarak sağlarız, bu bir karma koduna dönüştürülür ve mevcut anahtarlarla karşılaştırılır. Bir eşleşme varsa, karşılık gelen öğenin değeri döndürülür. Karşılaştırma eql? yöntemi altında.
"zen".eql? "zen" # Output: => true
# is the same as
"zen".hash == "zen".hash # Output: => true
Çoğu durumda, eql? yöntemi == yöntemine benzer şekilde davranır. Ancak, birkaç istisna vardır. Örneğin, eql? bir tamsayıyı bir kayan noktalı sayı ile karşılaştırırken örtük tür dönüştürme gerçekleştirmez.
2 == 2.0 # Output: => true
2.eql? 2.0 # Output: => false
2.hash == 2.0.hash # Output: => false
Vaka eşitliği operatörü: ===
Ruby'nin String, Range ve Regexp gibi yerleşik sınıflarının birçoğu, büyük / küçük harf eşitliği, üçlü eşitlik veya üçlü değer olarak da bilinen === operatörünün kendi uygulamalarını sağlar. Her sınıfta farklı uygulandığından, çağrıldığı nesnenin türüne bağlı olarak farklı davranacaktır. Genel olarak, sağdaki nesne "nesnesine" aitse veya "soldaki nesnenin" üyesi ise true değerini döndürür. Örneğin, bir nesnenin bir sınıfın (ya da alt sınıflarından birinin) bir örneği olup olmadığını test etmek için kullanılabilir.
String === "zen" # Output: => true
Range === (1..2) # Output: => true
Array === [1,2,3] # Output: => true
Integer === 2 # Output: => true
Aynı sonuç, muhtemelen işe en uygun diğer yöntemlerle de elde edilebilir. Verimlilik ve kısalıktan ödün vermeden, olabildiğince açık olarak okunması kolay kod yazmak genellikle daha iyidir.
2.is_a? Integer # Output: => true
2.kind_of? Integer # Output: => true
2.instance_of? Integer # Output: => false
2 gibi tamsayılar, Integer sınıfının bir alt sınıfı olan Fixnum sınıfının örnekleri olduğu için false döndürülen son örneğe dikkat edin. ===, is_a? ve örnek_o? nesne verilen sınıfın veya alt sınıfların bir örneği ise yöntemler true değerini döndürür. İnstance_of yöntemi daha katıdır ve yalnızca nesne bir alt sınıfın değil, o sınıfın bir örneğiyse true değerini döndürür.
İs_a? ve tür_o? yöntemleri Object sınıfı tarafından karıştırılan Çekirdek modülünde uygulanır. Her ikisi de aynı yöntemin takma adlarıdır. Doğrulayalım:
Çekirdek.instance_method (: kind_of?) == Çekirdek.instance_method (: is_a?) # Çıktı: => true
=== Aralık Uygulaması
Bir aralık nesnesinde === işleci çağrıldığında, sağdaki değer soldaki aralık içine düşerse true değerini döndürür.
(1..4) === 3 # Output: => true
(1..4) === 2.345 # Output: => true
(1..4) === 6 # Output: => false
("a".."d") === "c" # Output: => true
("a".."d") === "e" # Output: => false
=== operatörünün sol nesnenin === yöntemini çağırdığını unutmayın. Yani (1..4) === 3 (1..4) 'e eşittir. === 3. Başka bir deyişle, sol taraftaki işlenenin sınıfı === yönteminin hangi uygulamasının olacağını tanımlayacaktır. denir, bu nedenle işlenen konumları değiştirilemez.
Normal İfade ===
Sağdaki dize, soldaki normal ifadeyle eşleşiyorsa true değerini döndürür. / zen / === "bugün zazen alıştırması" # Çıktı: => true # "bugün zazen alıştırması" ile aynıdır = ~ / zen /
Vaka / when ifadelerinde === operatörünün örtülü kullanımı
Bu operatör ayrıca case / when ifadelerinde başlık altında da kullanılır. En yaygın kullanımı budur.
minutes = 15
case minutes
when 10..20
puts "match"
else
puts "no match"
end
# Output: match
Yukarıdaki örnekte, Ruby çift eşit işleç (==) örtük olarak kullansaydı, 10..20 aralığı 15 gibi bir tam sayıya eşit kabul edilmezdi. Üç eşit eşit işleç (===) her durumda / when ifadelerinde dolaylı olarak kullanılır. Yukarıdaki örnekteki kod şuna eşdeğerdir:
if (10..20) === minutes
puts "match"
else
puts "no match"
end
Örüntü eşleme işleçleri: = ~ ve! ~
= ~ (Eşit-tilde) ve! ~ (Bang-tilde) işleçleri, dizeleri ve sembolleri normal ifadelere göre eşleştirmek için kullanılır.
= ~ Yönteminin String ve Symbol sınıflarında uygulanması, bağımsız değişken olarak normal bir ifade (Regexp sınıfının bir örneği) bekler.
"practice zazen" =~ /zen/ # Output: => 11
"practice zazen" =~ /discursive thought/ # Output: => nil
:zazen =~ /zen/ # Output: => 2
:zazen =~ /discursive thought/ # Output: => nil
Regexp sınıfındaki uygulama, bağımsız değişken olarak bir dize veya simge bekliyor.
/zen/ =~ "practice zazen" # Output: => 11
/zen/ =~ "discursive thought" # Output: => nil
Tüm uygulamalarda, dize veya sembol Regexp deseniyle eşleştiğinde, eşleşmenin konumu (dizin) olan bir tamsayı döndürür. Eşleşme yoksa sıfır döndürür. Ruby'de, herhangi bir tamsayı değerinin "doğruluk" ve nil "yanlış" olduğunu unutmayın, bu nedenle = ~ operatörü if ifadelerinde ve üçlü operatörlerde kullanılabilir.
puts "yes" if "zazen" =~ /zen/ # Output: => yes
"zazen" =~ /zen/?"yes":"no" # Output: => yes
Örüntü eşleştirme işleçleri, daha kısa if ifadeleri yazmak için de yararlıdır. Misal:
if meditation_type == "zazen" || meditation_type == "shikantaza" || meditation_type == "kinhin"
true
end
Can be rewritten as:
if meditation_type =~ /^(zazen|shikantaza|kinhin)$/
true
end
! ~ İşleci = ~ öğesinin tersidir, eşleşme olmadığında true değerini ve eşleşme varsa false değerini döndürür.
Bu blog gönderisinde daha fazla bilgi bulabilirsiniz .
"a" == "a"
,"a" === "a"
ve"a".eql? "a"
. Ama bu yanlış:"a".equal? "a"
(Benim yakut 1.9.2-p180)