comparaciones de casos de uso en lugar de ===
==
. Para muchos objetos del comportamiento de ===
y ==
es lo mismo, ver Numeric
y String
:
5 == 5 #=> true
5 === 5 #=> true
"hello" == "hello" #=> true
"hello" === "hello" #=> true
Pero para otros tipos de objeto ===
puede significar muchas cosas, por completo, dependiendo del receptor.
Para el caso de las clases, ===
comprueba si un objeto es una instancia de esa clase:
Class === Class.new #=> true.
Para Rango comprueba si un objeto cae en ese rango:
(5..10) === 6 #=> true
Para Procs , ===
en realidad invoca que Proc
:
multiple_of_10 = proc { |n| (n % 10) == 0 }
multiple_of_10 === 20 #=> true (equivalent to multiple_of_10.call(20))
Para otros objetos, verifique su definición de ===
para descubrir su comportamiento. No siempre es obvio, pero por lo general hacen algún tipo de sentido ..
Aquí hay un ejemplo Poniendo todo junto:
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
ver este enlace para más información: http://www.aimred.com/news/developers/2008/08/14/unlocking_the_power_of_case_equality_proc/
+1: ¡Gracias por tu visión! – Rekin
esta es toda la información útil, mucho que no sabía, también, pero no creo que aborde mi confusión. Con 'a = Foo.new.class' y' b = Foo', tanto 'a' como' b' se establecen en 'Foo'; también, 'a.class' y' b.class' son 'Clase'.¿Cómo es que 'a === b # => falso'? De acuerdo con los documentos, 'Object # ===' es equivalente a '# ==' a menos que se anule. ¿Qué está pasando en mi caso específico? –
@macek, porque (como dije) '===' * está * anulado para las clases. Entonces 'Foo === Foo' devolverá falso como' === 'en ese contexto verifica' is_a? 'Y no la igualdad directa. – horseyguy