2010-05-10 27 views
5

Soy nuevo en el mundo de Ruby y Ruby on Rails. He leído algunas guías, pero tengo algunos problemas con la siguiente sintaxis. creo que el uso de :condition sintaxis se utiliza en Ruby para definir un atributo de clase con algún tipo de descriptor de acceso, como:¿Qué significa: esto significa en Ruby on Rails?

class Sample 
    attr_accessor :condition 
end 

que declara implícitamente el captador y definidor de la propiedad "condición". Mientras estaba buscando un código de muestra de Rails, encontré los siguientes ejemplos que no entiendo completamente.

Por ejemplo:

@post = Post.find(params[:id]) 

por eso que es el acceso al atributo id con esta sintaxis, en lugar de:

@post = Post.find(params[id]) 


O, por ejemplo:

@posts = Post.find(:all) 

Es :all una constante aquí? Si no, ¿qué significa realmente este código? Si es así, ¿por qué no se utiliza la siguiente:

@posts = Post.find(ALL) 

Gracias

Respuesta

10

dos puntos antes de texto indica un símbolo en Ruby. Un símbolo es algo así como una constante, pero es casi como si un símbolo recibe un valor único (que no le importa) como su valor constante.

Cuando se usan como índices hash, los símbolos son casi (pero no exactamente) lo mismo que usar cadenas.

Además, puede leer "todos" desde :all llamando al to_s en el símbolo. Si tuviera una variable constante ALL, no habría manera de determinar que significaba "todo" más que buscar su valor. Esta es también la razón por la cual puede usar símbolos como argumentos para meta-métodos como attr_accessor, attr_reader, y similares.

Es posible que desee read up on Ruby symbols.

+0

Me parece que un símbolo parece un valor Enum en Java o C#, ¿verdad? – Mark

+0

@Marco: No, los símbolos en Ruby no son nada como los valores enum. Son más como símbolos en Lisp o símbolos en Smalltalk. –

+0

¡Lo tengo, gracias! – Mark

0

Esto no tiene nada que ver con Rails, es solo Ruby's Symbols. :all es un símbolo que es efectivamente solo una cadena básica.

1

:all es un símbolo. Los símbolos son la versión de Ruby de interned strings. Puedes pensarlo así: hay una tabla global invisible llamada symbols que tiene claves String y valores Fixnum. Cualquier cadena se puede convertir en un símbolo llamando al .to_sym, que busca la cadena en la tabla. Si la cadena ya está en la tabla, devuelve el Fixnum, de lo contrario, lo ingresa en la tabla y devuelve el siguiente Fixnum. Debido a esto, los símbolos son tratados en tiempo de ejecución como fixnums: Tiempo de comparación es constante (en C jerga, las comparaciones de símbolos se pueden hacer con == en lugar de strcmp)

Puede verificar esto buscando en el object_id de objetos ; cuando los object_ids de dos objetos son iguales, ambos apuntan al mismo objeto.

Se puede ver que se puede convertir dos cadenas de símbolos, y las dos tendrán el mismo identificador de objeto:

"all".to_sym.object_id == "all".to_sym.object_id #=> true

"all".to_sym.object_id == :all.object_id #=> true

Pero lo contrario no es cierto: (cada uno llamar al símbolo # to_s producirá una marca nueva cadena)

:all.to_s.object_id == :all.to_s.object_id #=> false

1

No mire los símbolos como una forma de guardar memoria. Mírelos como indicando que la cuerda debe ser inmutable. 13 Ways of Looking at a Ruby Symbol ofrece una variedad de formas de ver un símbolo.

Para usar una metáfora: los símbolos son para pruebas de opción múltiple, las cadenas son para preguntas de ensayo.