ตัวดำเนินการความเสมอภาค: == และ! =
ตัวดำเนินการ == หรือที่รู้จักกันว่าความเท่าเทียมกันหรือเท่ากันสองเท่าจะส่งกลับค่าจริงถ้าวัตถุทั้งสองมีค่าเท่ากันและเป็นเท็จหากไม่มี
"koan" == "koan" # Output: => true
ตัวดำเนินการ! = หรือที่รู้จักกันว่าความไม่เท่าเทียมกันนั้นตรงกันข้ามกับ == มันจะกลับมาจริงถ้าวัตถุทั้งสองไม่เท่ากันและเท็จถ้าพวกเขาเท่ากัน
"koan" != "discursive thought" # Output: => true
โปรดทราบว่าสองอาร์เรย์ที่มีองค์ประกอบเดียวกันในลำดับที่แตกต่างกันจะไม่เท่ากันตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กของตัวอักษรเดียวกันจะไม่เท่ากันเป็นต้น
เมื่อเปรียบเทียบจำนวนประเภทต่าง ๆ (เช่นจำนวนเต็มและจำนวนลอย) หากค่าตัวเลขเหมือนกัน == จะส่งกลับค่าจริง
2 == 2.0 # Output: => true
เท่ากัน?
ไม่เหมือนกับตัวดำเนินการ == ซึ่งทดสอบว่าตัวถูกดำเนินการทั้งสองเท่ากันหรือไม่วิธีการที่เท่ากันจะตรวจสอบว่าตัวถูกดำเนินการทั้งสองอ้างถึงวัตถุเดียวกันหรือไม่ นี่คือรูปแบบที่เข้มงวดที่สุดของความเท่าเทียมกันในทับทิม
ตัวอย่าง: a = "zen" b = "zen"
a.object_id # Output: => 20139460
b.object_id # Output :=> 19972120
a.equal? b # Output: => false
ในตัวอย่างข้างต้นเรามีสองสตริงที่มีค่าเท่ากัน อย่างไรก็ตามมันเป็นวัตถุสองชิ้นที่แตกต่างกันโดยมี ID วัตถุต่างกัน ดังนั้นที่เท่ากัน? วิธีการจะกลับเท็จ
ลองอีกครั้งเฉพาะเวลานี้ b จะเป็นการอ้างอิงถึง ขอให้สังเกตว่า ID วัตถุเหมือนกันสำหรับตัวแปรทั้งสองเนื่องจากพวกเขาชี้ไปที่วัตถุเดียวกัน
a = "zen"
b = a
a.object_id # Output: => 18637360
b.object_id # Output: => 18637360
a.equal? b # Output: => true
EQL?
ในชั้น Hash, eql? วิธีใช้สำหรับทดสอบคีย์เพื่อความเท่าเทียมกัน พื้นหลังบางอย่างจำเป็นต้องอธิบายเรื่องนี้ ในบริบททั่วไปของการคำนวณฟังก์ชันแฮชจะใช้สตริง (หรือไฟล์) ขนาดใดก็ได้และสร้างสตริงหรือจำนวนเต็มขนาดคงที่เรียกว่าแฮชโค้ดซึ่งโดยทั่วไปจะเรียกว่าแฮชเท่านั้น ประเภทแฮชโค้ดที่ใช้กันทั่วไปบางประเภทคือ MD5, SHA-1 และ CRC พวกมันถูกใช้ในอัลกอริธึมการเข้ารหัสการทำดัชนีฐานข้อมูลการตรวจสอบความสมบูรณ์ของไฟล์ ฯลฯ ภาษาการเขียนโปรแกรมบางอย่างเช่น Ruby ให้ประเภทของคอลเลกชันที่เรียกว่าตารางแฮช ตารางแฮชคือชุดพจนานุกรมที่เก็บข้อมูลเป็นคู่ประกอบด้วยคีย์เฉพาะและค่าที่เกี่ยวข้อง ภายใต้ประทุนคีย์เหล่านั้นจะถูกเก็บไว้เป็นแฮชโค้ด ตารางแฮชมักจะเรียกว่าเป็นเพียงแค่แฮช สังเกตว่าคำว่า hashcan อ้างอิงถึง hashcode หรือตาราง hash อย่างไร
Ruby นำเสนอวิธีการในตัวที่เรียกว่าแฮชสำหรับสร้างแฮชโค้ด ในตัวอย่างด้านล่างมันต้องใช้สตริงและส่งกลับ hashcode ขอให้สังเกตว่าสตริงที่มีค่าเดียวกันจะมีแฮชโค้ดที่เหมือนกันแม้ว่าจะเป็นวัตถุที่แตกต่างกัน (ด้วย ID วัตถุที่แตกต่างกัน)
"meditation".hash # Output: => 1396080688894079547
"meditation".hash # Output: => 1396080688894079547
"meditation".hash # Output: => 1396080688894079547
วิธีการแฮชนำมาใช้ในโมดูลเคอร์เนลซึ่งรวมอยู่ในคลาสวัตถุซึ่งเป็นรูทเริ่มต้นของวัตถุทับทิมทั้งหมด บางคลาสเช่น Symbol และ Integer ใช้การเริ่มต้นใช้งานส่วนอื่น ๆ เช่น String และ Hash จะมีการใช้งานของตัวเอง
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 เมื่อเราเก็บบางสิ่งในแฮช (คอลเลกชัน) วัตถุที่ให้เป็นคีย์ (เช่นสตริงหรือสัญลักษณ์) จะถูกแปลงเป็นและเก็บเป็นแฮชโค้ด ต่อมาเมื่อดึงองค์ประกอบจากแฮช (คอลเลกชัน) เราให้วัตถุเป็นคีย์ซึ่งจะถูกแปลงเป็นแฮชโค้ดและเปรียบเทียบกับคีย์ที่มีอยู่ หากมีการแข่งขันค่าของรายการที่สอดคล้องกันจะถูกส่งกลับ ทำการเปรียบเทียบโดยใช้ eql หรือไม่ วิธีการภายใต้ประทุน
"zen".eql? "zen" # Output: => true
# is the same as
"zen".hash == "zen".hash # Output: => true
ในกรณีส่วนใหญ่ eql? วิธีการทำงานคล้ายกับวิธี == อย่างไรก็ตามมีข้อยกเว้นเล็กน้อย ตัวอย่างเช่น eql? ไม่ทำการแปลงชนิดโดยนัยเมื่อเปรียบเทียบจำนวนเต็มกับทศนิยม
2 == 2.0 # Output: => true
2.eql? 2.0 # Output: => false
2.hash == 2.0.hash # Output: => false
ตัวดำเนินการความเสมอภาคของคดี: ===
หลายคลาสในตัวของรูบี้เช่น String, Range, และ Regexp นำเสนอการใช้งานของตัวเองของโอเปอเรเตอร์ === ซึ่งรู้จักกันในชื่อ case-equality, triple เท่ากับหรือ threequals เนื่องจากมันมีการใช้งานที่แตกต่างกันในแต่ละชั้นเรียนมันจะทำงานแตกต่างกันไปขึ้นอยู่กับประเภทของวัตถุที่ถูกเรียกใช้ โดยทั่วไปแล้วจะส่งกลับค่าจริงหากวัตถุทางด้านขวา "เป็นของ" หรือ "เป็นสมาชิกของ" วัตถุทางด้านซ้าย ตัวอย่างเช่นมันสามารถใช้ในการทดสอบว่าวัตถุเป็นตัวอย่างของการเรียน (หรือหนึ่งในคลาสย่อยของมัน)
String === "zen" # Output: => true
Range === (1..2) # Output: => true
Array === [1,2,3] # Output: => true
Integer === 2 # Output: => true
ผลลัพธ์เดียวกันสามารถทำได้ด้วยวิธีอื่น ๆ ซึ่งอาจเหมาะสมที่สุดสำหรับงาน โดยปกติแล้วการเขียนโค้ดที่อ่านง่ายโดยชัดเจนที่สุดเท่าที่จะทำได้โดยไม่ต้องเสียสละประสิทธิภาพและความรัดกุม
2.is_a? Integer # Output: => true
2.kind_of? Integer # Output: => true
2.instance_of? Integer # Output: => false
ขอให้สังเกตตัวอย่างสุดท้ายที่ส่งคืนเท็จเนื่องจากจำนวนเต็มเช่น 2 เป็นอินสแตนซ์ของคลาส Fixnum ซึ่งเป็นคลาสย่อยของคลาส Integer ===, is_a? และ instance_of? วิธีการส่งกลับจริงถ้าวัตถุเป็นตัวอย่างของการเรียนที่กำหนดหรือคลาสย่อยใด ๆ เมธอด instance_of นั้นเข้มงวดและจะคืนค่าเป็นจริงถ้าอ็อบเจ็กต์เป็นอินสแตนซ์ของคลาสที่แน่นอนไม่ใช่คลาสย่อย
is_a และ kind_of? วิธีการที่จะดำเนินการในโมดูลเคอร์เนลซึ่งถูกผสมในคลาสวัตถุ ทั้งสองเป็นนามแฝงกับวิธีการเดียวกัน ตรวจสอบกันเลย:
Kernel.instance_method (: kind_of?) == Kernel.instance_method (: is_a?) # ผลลัพธ์: => จริง
การใช้งานช่วง ===
เมื่อผู้ประกอบการ === ถูกเรียกบนวัตถุช่วงมันจะส่งกลับจริงถ้าค่าทางด้านขวาตกอยู่ในช่วงทางด้านซ้าย
(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
โปรดจำไว้ว่าตัวดำเนินการ === จะเรียกใช้เมธอด === ของวัตถุทางซ้าย ดังนั้น (1..4) === 3 จึงเท่ากับ (1..4) === 3. กล่าวอีกนัยหนึ่งคลาสของตัวถูกดำเนินการทางซ้ายจะกำหนดว่าการใช้งานวิธี === จะเป็นอย่างไร เรียกดังนั้นตำแหน่งตัวถูกดำเนินการไม่สามารถใช้แทนกันได้
การใช้ Regexp ของ ===
ผลตอบแทนจริงถ้าสตริงด้านขวาตรงกับการแสดงออกปกติทางด้านซ้าย / zen / === "ฝึกฝน zazen วันนี้" # เอาท์พุท: => true # เหมือนกับ "ฝึก zazen วันนี้" = ~ / zen /
การใช้งานโดยนัยของโอเปอเรเตอร์ === สำหรับคำสั่ง case / when
ผู้ประกอบการนี้ยังใช้ภายใต้ประทุนในกรณีที่ / เมื่องบ นั่นคือการใช้งานที่พบบ่อยที่สุด
minutes = 15
case minutes
when 10..20
puts "match"
else
puts "no match"
end
# Output: match
ในตัวอย่างด้านบนหาก Ruby ใช้ตัวดำเนินการเท่ากับสองเท่าโดยนัย (==) ช่วง 10..20 จะไม่ถูกพิจารณาว่าเท่ากับจำนวนเต็มเช่น 15 พวกเขาจับคู่เพราะตัวดำเนินการเท่ากับสามตัว (===) คือ ใช้โดยนัยในทุกกรณี / เมื่อมีคำสั่ง โค้ดในตัวอย่างด้านบนเทียบเท่ากับ:
if (10..20) === minutes
puts "match"
else
puts "no match"
end
ตัวดำเนินการจับคู่รูปแบบ: = ~ และ! ~
ตัวดำเนินการ = ~ (เท่ากับ-tilde) และ! ~ (bang-tilde) ใช้เพื่อจับคู่สตริงและสัญลักษณ์กับรูปแบบ regex
การใช้งานเมธอด = ~ ในคลาส String และ Symbol ต้องการนิพจน์ทั่วไป (อินสแตนซ์ของคลาส Regexp) เป็นอาร์กิวเมนต์
"practice zazen" =~ /zen/ # Output: => 11
"practice zazen" =~ /discursive thought/ # Output: => nil
:zazen =~ /zen/ # Output: => 2
:zazen =~ /discursive thought/ # Output: => nil
การใช้งานในคลาส Regexp คาดว่าสตริงหรือสัญลักษณ์เป็นอาร์กิวเมนต์
/zen/ =~ "practice zazen" # Output: => 11
/zen/ =~ "discursive thought" # Output: => nil
ในการประยุกต์ใช้ทั้งหมดเมื่อสตริงหรือสัญลักษณ์ตรงกับรูปแบบ Regexp มันจะส่งกลับจำนวนเต็มซึ่งเป็นตำแหน่ง (ดัชนี) ของการแข่งขัน หากไม่มีการจับคู่ก็จะส่งกลับศูนย์ โปรดจำไว้ว่าใน Ruby ค่าจำนวนเต็มใด ๆ คือ "truey" และ nil คือ "falsy" ดังนั้นตัวดำเนินการ = ~ สามารถใช้ในถ้า statement และตัวดำเนินการที่ประกอบไปด้วยสามส่วน
puts "yes" if "zazen" =~ /zen/ # Output: => yes
"zazen" =~ /zen/?"yes":"no" # Output: => yes
โอเปอเรเตอร์การจับคู่รูปแบบยังมีประโยชน์สำหรับการเขียนให้สั้นลงหากคำสั่ง ตัวอย่าง:
if meditation_type == "zazen" || meditation_type == "shikantaza" || meditation_type == "kinhin"
true
end
Can be rewritten as:
if meditation_type =~ /^(zazen|shikantaza|kinhin)$/
true
end
ตัวดำเนินการ! ~ อยู่ตรงข้ามกับ = ~ มันจะส่งกลับค่าจริงเมื่อไม่มีการจับคู่และเท็จถ้ามีการแข่งขัน
ข้อมูลเพิ่มเติมสามารถดูได้ที่โพสต์บล็อกนี้
"a" == "a"
, และ"a" === "a"
"a".eql? "a"
แต่นี่เป็นเท็จ:"a".equal? "a"
(เหมืองทับทิม 1.9.2-p180)