2012-04-06 23 views
5

Estoy un poco confundido acerca de las palabras reservadas en Ruby.¿Son palabras reservadas "inicial" y "final" o no?

"The Ruby Programming Language", en coautoría de Matz, dice que begin y end son palabras reservadas del idioma. Ciertamente se usan sintácticamente para marcar bloques.

Sin embargo, los objetos estándar en el lenguaje han métodos llamado begin y end, como en

(1..10).end 
=> 10 

Ahora, las pruebas de esto, me parece que, de hecho, puedo definir métodos denominados "begin" y "end "en objetos, aunque si intento nombrar una variable" begin ", falla. (He aquí una muestra de utilizarlo como un nombre de método, en que realmente funciona ... :)

class Foo 
    def begin 
    puts "hi" 
    end 
end 

Foo.new.begin 

Por lo tanto, supongo que estoy pidiendo, lo que en realidad es el estado de palabras reservadas como éste? Me hubiera imaginado que no podrían usarse para nombres de métodos (y sin embargo parece funcionar) o que al menos sería un estilo terrible (pero en realidad se usa en el lenguaje central para la clase Range).

Estoy bastante confundido en cuanto a cuándo pueden usarse y para qué. ¿Hay incluso documentación sobre esto?

Respuesta

10

Sí, son palabras reservadas. Sí, se pueden usar para nombres de métodos. No, no puedes llamarlos sin un receptor explícito. Probablemente no sea una buena idea de todos modos.

class Foo 
    def if(foo) 
    puts foo 
    end 
end 

Foo.new.if("foo") # outputs foo, returns nil 

Actualización: He aquí una cita de "The Ruby Programming Language", por Matz (el creador de Rubí) a sí mismo:

En la mayoría de los idiomas, estas palabras serían llamados “palabras reservadas "Y nunca estarían permitidos como identificadores. El analizador de Ruby es flexible y no se queja si prefija estas palabras clave con @, @@, o $ prefijos y los utiliza como nombres de instancia, clase o variable global . Además, puede usar estas palabras clave como nombres de método, con la advertencia de que el método siempre debe invocarse explícitamente a través de un objeto .

+0

¿Esto es cierto para todas las "palabras reservadas"? Si es un estilo malo, ¿por qué lo hace la API central? (Aunque intuitivamente, parece un estilo horrible, de hecho, algo terrible para el lenguaje). Y, * ¿está documentado *? – Perry

+0

Está permitido porque a veces tener métodos llamados como una palabra reservada puede tener sentido (en mi humilde opinión 'Range # end') es un buen ejemplo. Las cosas no siempre son en blanco y negro, como la mayoría de las características, esto podría ser útil si se usa con cuidado. En cuanto a la documentación, apareció una búsqueda rápida en Google http://www.tutorialspoint.com/ruby/ruby_syntax.htm, que establece que "estas palabras reservadas no se pueden usar como nombres constantes o variables. Sin embargo, pueden hacerlo. , ser utilizado como nombres de método ", que en mi humilde opinión tiene mucho sentido. –

+0

Sin embargo, eso no parece ser documentación oficial. (No he encontrado ninguna mención al respecto en los documentos oficiales, aunque eso no implica que no exista). – Perry

2

Cuando se proporcionan en un formulario que es inequívocamente una llamada a método, puede usarlos. Si tiene un período delante de él .begin o tiene paréntesis después es begin(), entonces es inequívocamente una llamada a método. Cuando intenta usarlo como una variable begin, es ambiguo (en principio).

En realidad, como dice Perry, begin() puede ser complicado. He hablado con IRB con Ruby 1.9.3, y la siguiente sucede algo extraño:

irb(main):001:0> def begin(foo) 
irb(main):002:1> puts 'a' 
irb(main):003:1> end 
=> nil 
irb(main):004:0> begin(3) 
irb(main):005:1> 
irb(main):006:1* end 
=> 3 

no está definido, y lo que parece ser una llamada de método podría ser sólo un bloque de devolver el último evaluado 3. Pero las líneas alrededor de def begin(foo) siguen siendo un misterio.

+1

Su afirmación sobre paréntesis parece ser falsa, al menos en Ruby 1.9.3 - begin() no parece funcionar para mí. – Perry

+0

@sawa Nada extraño aquí. Los paréntesis se interpretan como - innecesarios - paréntesis alrededor del cuerpo del bloque. Es por eso que el 3 se devuelve como está. Wy la primera definición es un misterio que no entiendo, todas las definiciones de método devuelven 'nil' y' self.methods.grep (/ beg /) # => [: begin] '. Si simplemente tecleas 'send (: begin)' en IRB, funcionará. –

+0

@MichaelKohl ¿Qué se define en la definición que comienza con 'def begin (foo)'? – sawa

Cuestiones relacionadas