operadores comparacion ruby

operadores de comparacion ruby



¿Qué hace el operador "===" en Ruby? (3)

Al igual que con cualquier otro método en Ruby (o en realidad prácticamente cualquier lenguaje orientado a objetos),

a === b

significa lo que el autor de la clase quiere que signifique.

Sin embargo, si no quiere confundir al diablo con sus colegas, la convención es que === es el operador de subsunción del caso . Básicamente, es un operador booleano que hace la pregunta " Si tengo un cajón etiquetado, ¿tendría sentido poner b en ese cajón? "

Una formulación alternativa es " Si a conjunto descrito, ¿sería b un miembro de ese conjunto? "

Por ejemplo:

(1..5) === 3 # => true (1..5) === 6 # => false Integer === 42 # => true Integer === ''fourtytwo'' # => false /ell/ === ''Hello'' # => true /ell/ === ''Foobar'' # => false

El uso principal para el operador === es en expresiones de case , ya que

case foo when bar baz when quux flurb else blarf end

se traduce a algo (más o menos) como

_temp = foo if bar === _temp baz elsif quux === _temp flurb else blarf end

Tenga en cuenta que si desea buscar este operador, por lo general se lo llama el operador de triple igual o el operador de tres o el operador de igualdad de mayúsculas y minúsculas . Realmente no me gustan esos nombres, porque este operador no tiene absolutamente nada que ver con la igualdad.

En particular, uno esperaría que la igualdad fuera simétrica: si a es igual a b , entonces b también sería igual a a . Además, uno esperaría que la igualdad fuera transitiva: si a == b y b == c , entonces a == c . Si bien no hay forma de garantizar realmente que en un solo lenguaje de envío como Ruby, al menos debe hacer un esfuerzo para preservar esta propiedad (por ejemplo, siguiendo el protocolo de coerce ).

Sin embargo, para === no hay expectativa de simetría o transitividad. De hecho, es mucho por diseño no simétrico. Es por eso que no me gusta llamarlo algo que remotamente se parezca a la igualdad. También es por eso que creo, debería haber sido llamado algo así como ~~~ o lo que sea.

Posible duplicado:
=== vs. == en Ruby

Lo he visto usado algunas veces últimamente pero no puedo entender qué hace. ¿Alguien puede ilustrar cómo funciona?


En Ruby, el operador === se usa para probar la igualdad dentro de una cláusula when de una declaración de case . En otros idiomas, lo anterior es cierto.

Que yo sepa, Ruby no tiene operadores verdaderos , todos son métodos que se invocan en el LHS de la expresión, pasando el RHS de la expresión. Entonces, en realidad, podría anular cualquier "operador" que desee en sus clases para realizar lo que quiera (análogamente a la sobrecarga del operador en C ++).


Gracias por tu edición, Jacob, estaba a punto de llamarte;) De todos modos, publicaré un par de ejemplos. La implementación de === varía según el tipo. Por ejemplo:

(1...3) === 2 => true /test/ === "this is a test" => true case ''test'' when /blah/ "Blach" when /test/ "Test" else "Fail" end => "Test"

Stephen, checkout http://ruby-doc.org/docs/ProgrammingRuby/ (el "Pico"), debería ser capaz de ayudarte con preguntas como esta en el futuro.