2009-03-03 20 views
5

He instalado el plugin de acts_as_versioned github.com en mi solicitud rieles, y había un bloque de código que no entiendo totalmente, yo estaba esperando que alguien podría aclarar esto para mípregunta general sobre Ruby

class_eval <<-CLASS_METHODS 
    def a_bunch_of_stuff 
    .... 
    end 
CLASS_METHODS 

Entiendo que los métodos dentro del bloque (o lo que sea) se definen como métodos de instancia dentro de la clase, pero no puedo encontrar CLASS_METHODS definido como una constante en ningún lugar del complemento, y tampoco estoy seguro qué < < - después de class_eval significa. el complemento está ubicado en here, y el código en cuestión comienza en la línea 199 de lib/acts_as_versioned.rb. Si alguien me diera la verdad aquí, estaría muy agradecido.

THX

-C

Respuesta

7

Es un heredoc. http://en.wikipedia.org/wiki/Heredoc#Ruby

Los tokens CLASS_METHODS coincidentes son esencialmente citas iniciales y finales. Si usa < < - en lugar de < <, el token de terminación se puede sangrar con espacios en blanco.

Se pueden utilizar varios heredocs a la vez en Rubí (hice mi heredocs los mismos que los nombres de los argumentos, pero eso es sólo para estética - no hay diferencia):

def define_with_description description, code 
    puts "defining a method to #{description}" 
    class_eval code 
end 

define_with_description <<-DESCRIPTION, <<-CODE 
    set up us the bomb 
DESCRIPTION 
    Bomb.new.set_up(us) 
CODE 
6

Esta es una "here document", que es una forma de citar a grandes líneas múltiples en línea. De Programming Ruby:

Las cadenas pueden continuar a través de múltiples líneas de entrada, en cuyo caso contendrán caracteres de nueva línea. También es posible usar aquí documentos para expresar literales largos de cadena. Cada vez que Ruby analiza la secuencia <<identifier o <<quoted string, la reemplaza por una cadena literal construida a partir de sucesivas líneas de entrada lógica. Deja de construir la cadena cuando encuentra una línea que comienza con el identificador o la cadena entre comillas. Puede poner un signo menos inmediatamente después de los caracteres <<, en cuyo caso el terminador puede sangrarse desde el margen izquierdo. Si se utilizó una cadena entrecomillada para especificar el terminador, sus reglas de cotización se aplicarán al documento aquí; de lo contrario, se aplican las reglas de doble cita.

Esto hará que class_eval para el tratamiento de la materia entre CLASS_METHODS como una cadena y ejecutarlo en el contexto apropiado. El uso del nombre CLASS_METHODS es arbitrario, podría haber sido llamado fácilmente cualquier otra cosa.

-2

Estos son equivalentes:

class SomeClass 
    class_eval <<-CLASS_METHODS 
    def first_method 
    end 
    def second_method 
    end 
    CLASS_METHODS 
end 

class SomeClass 
    def self.first_method 
    end 
    def self.second_method 
    end 
end