2010-07-23 12 views
7

siguiente fragmento de código es de rieles¿Cuál es el operador <= en las clases de Ruby?

def rescue_from(*klasses, &block) 
    options = klasses.extract_options! 

    unless options.has_key?(:with) 
     if block_given? 
     options[:with] = block 
     else 
     raise ArgumentError, "Need a handler. Supply an options hash that has a :with key as the last argument." 
     end 
    end 

    klasses.each do |klass| 
     key = if klass.is_a?(Class) && klass <= Exception 
     klass.name 
     elsif klass.is_a?(String) 
     klass 
     else 
     raise ArgumentError, "#{klass} is neither an Exception nor a String" 
     end 

     # put the new handler at the end because the list is read in reverse 
     self.rescue_handlers += [[key, options[:with]]] 
    end 
    end 
end 

Aviso al operador < =

¿qué es eso?

Respuesta

9

Ver http://ruby-doc.org/core/classes/Module.html#M001669 de documentación sobre todos los operadores de comparación expuestos por módulos (y por lo tanto las clases).

En este caso específico: "Devuelve true si mod es una subclase de otro o es igual a otro. Devuelve nil si no hay relación entre los dos. (Piense en la relación en términos de la definición de clase : "class A < B" implica "A < B"). "

1

Bastante seguro que eso significa que klass es un tipo de excepción.

Por lo general, eso significa 'menor o igual que'. Entonces ese código podría decir si es al menos una clase pero no una excepción ... hacer algo. Pero entonces la arquitectura de 'menos que' estaría fuera de lugar.

De la documentación Código

# Los manipuladores son heredados. Se buscan de derecha a izquierda, desde
# de abajo hacia arriba y hacia arriba en la jerarquía. El controlador de la primera clase para
# que exception.is_a? (Klass) es verdadero es el que se invoca, si existe.

3

es el operador para "LHS es la misma clase que o Subclase de RHS". < es el operador de "LHS es una subclase de RHS".

Ésta es la sobrecarga de operadores loco, pero tenga en cuenta que las declaraciones de subclases en Ruby también utilizar <, como en

class SomeClass < ActiveRecord::Base 

así que al menos es constante en ese sentido.

(LHS: lado izquierdo, lado derecho: lado derecho)

+0

¿Por qué crees que es una "sobrecarga loca de operadores"? La relación de herencia impone un orden parcial en las clases y, en general, el símbolo utilizado para representar las relaciones que imponen ordenamientos parciales es '<=' (o más bien '≤' pero mientras ese es un nombre de método válido en Ruby, no es válido nombre del operador). Tiene razón en la medida en que el operador habitual para denotar una relación de subtipo es '<:', pero ese no es ni un método válido ni un nombre de operador en Ruby, así que personalmente siento que '<= 'es lo suficientemente bueno. Ciertamente supera el abuso común de usar '+' para establecer la unión (que debería ser '∪'). –

4

Es comparable con el método is_a? que devuelve verdadero si la clase de receptor es una subclase del argumento; Consideremos:

Fixnum.superclass # => Integer 
Fixnum <= Integer # => true 
Cuestiones relacionadas