confronti caso d'uso ===
piuttosto che ==
. Per molti oggetti il comportamento di ===
e ==
è lo stesso, vedi Numeric
e String
:
5 == 5 #=> true
5 === 5 #=> true
"hello" == "hello" #=> true
"hello" === "hello" #=> true
Ma per altri tipi di oggetto ===
può significare molte cose, del tutto a seconda del ricevente.
Per il caso di classi, ===
verifica se un oggetto è un'istanza di tale classe:
Class === Class.new #=> true.
Per Gamma controlla se un oggetto cade in quell'intervallo:
(5..10) === 6 #=> true
Per Procs , ===
effettivamente invoca che Proc
:
multiple_of_10 = proc { |n| (n % 10) == 0 }
multiple_of_10 === 20 #=> true (equivalent to multiple_of_10.call(20))
Per altri oggetti, verificare la loro definizione di ===
per scoprire il loro comportamento. Non è sempre evidente, ma di solito fanno un qualche tipo di senso ..
Ecco un esempio Mettere tutto insieme:
case number
when 1
puts "One"
when 2..9
puts "Between two and nine"
when multiple_of_10
puts "A multiple of ten"
when String
puts "Not a number"
end
Vedere questo link per maggiori informazioni: http://www.aimred.com/news/developers/2008/08/14/unlocking_the_power_of_case_equality_proc/
+1: Grazie per l'intuizione! – Rekin
queste sono tutte informazioni molto utili, molte cose che non sapevo, ma non mi sento in grado di risolvere la mia confusione. Con 'a = Foo.new.class' e' b = Foo', sia 'a' che' b' sono impostati su 'Foo'; inoltre, 'a.class' e' b.class' sono 'Class'.Come mai 'a === b # => falso'? Secondo i documenti, 'Object # ===' è equivalente a '# ==' se non sottoposto a override. Cosa succede nel mio caso specifico? –
@macek, perché (come ho detto) '===' * è * sovrascritto per le classi. Quindi 'Foo === Foo' restituirà false come' === 'in quel contesto controlla' is_a? 'E non l'uguaglianza retta. – horseyguy