2010-09-21 16 views

Respuesta

21

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

+1: ¡Gracias por tu visión! – Rekin

+0

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? –

+0

@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

2

En el enunciado de caso, la comparación se realiza utilizando el operador ===.

lo que el código se traduce a lo siguiente:

case x 
when User === x 
    puts "Constant" 
when "User" === x 
    puts "string" 
else 
    puts "nothing" 
end 

clase diferente definen === en forma diferente:

La clase Class definen === de modo que comprueba si el operando de la derecha (x) es una instancia de la clase nombrada por el operando de la izquierda (User). Por lo tanto, no es sorprendente que User === x se evalúe como false. En cambio, User === u (u = User.new) es true.

irb(main):001:0> class User 
irb(main):002:1> end 
=> nil 
irb(main):003:0> u = User.new 
=> #<User:0xb7a90cd8> 
irb(main):004:0> User === u.class 
=> false 
irb(main):005:0> User === u 
=> true 
+0

simplemente descubrí ese 'Usuario === u' no es lo mismo que' u === Usuario'. Esto se está volviendo demasiado confuso ... –

+1

@macek, '===' es definido por el receptor, 'User' es una clase y tiene una definición diferente (y especial) de' === 'para un objeto arbitrario . Cualquier objeto dado puede implementar '===' como lo desee, vea: 'clase << u; def === (o); pone "hola mundo y # {o} !!"; fin; end' y luego: 'u === U # =>" hola mundo y U !! "' – horseyguy

Cuestiones relacionadas