2011-04-11 26 views
11

Digamos que tengo el siguiente código.ruby ​​triple igual

result = if a.is_a?(Class) && a <= Exception 
    a.name 
elsif ... 
elsif ... 
end 

I refactorizado este código para

case a 
when Exception 
    a.name 
when ... 
when ... 
end 

¿Entiendo el triple igual correctamente?

+2

@Chuck: en Ruby, cuando una declaración de caso es implícita ===. – EmFi

+0

¿Ha leído los documentos para 'Module # ==='? –

+0

Tenía una pregunta relacionada con esto: http://stackoverflow.com/questions/3757818/ruby-when-keyword-does-not-use-in-case-statement-what-does-it-use –

Respuesta

56

No podemos decir si realmente obtiene === o no de un ejemplo tan limitado. Pero aquí hay un desglose de lo que realmente está sucediendo cuando usa ===, explícita o implícitamente como parte de una sentencia case/when como la utilizada en el ejemplo ...

The triple equal (===) tiene muchas implementaciones diferentes que dependen de la clase de la parte izquierda. Es realmente solo una notación infija para el método. ===. Lo que significa que las siguientes afirmaciones son idénticos:

a.=== b 
a === b 

La diferencia no parece mucho, pero lo que significa es que el método === del lado izquierdo se invoca en lugar de algún operador mágico definido en el lenguaje nivel, es como == pero no del todo. En cambio, === se define en cada clase que lo usa, tal vez en una clase heredada o Mixin.

La definición general del triple igual es que devolverá verdadero si ambas partes son idénticas o si la parte derecha está dentro del rango de la izquierda.

En el caso de la clase. ===, la operación devolverá true si el argumento es una instancia de la clase (o subclase). En el caso en que el lado izquierdo es una expresión regular, devuelve verdadero cuando el lado derecho coincide con la expresión regular.

Cuando el caso es implícito === que compara la variable del caso con la cláusula when con === para que las dos declaraciones siguientes produzcan el mismo resultado.

case a 
when String 
    puts "This is a String" 
when (1..3) 
    puts "A number between 1 and 3" 
else 
    puts "Unknown" 
end 

if String === a 
    puts "This is a String" 
elsif (1..3) === a 
    puts "A number between 1 and 3" 
else 
    puts "Unknown" 
end 

revise la documentación de los tipos que utiliza en la mano izquierda de una === o en una declaración cuando sea seguro exactamente cómo funcionan las cosas.

+0

Gracias por la respuesta detallada. –

2

Creo que en el primer ejemplo se está comprobando si a es una subclase de Exception (corríjanme si me equivoco). El segundo ejemplo simplemente verifica si a es una instancia de Exception (equivalente a a.is_a?(Exception)).

Cuestiones relacionadas