2012-04-24 15 views

Respuesta

4

En un estándar de Ruby Hash no son el mismo (string vs symbol)

Sin embargo, los carriles SessionHash subclase llama to_s en las teclas antes de almacenarlos, por lo que todas las claves se almacenan como cadenas (incluso si se especifica una símbolo):

class SessionHash < Hash 

    def [](key) 
    load_for_read! 
    super(key.to_s) 
    end 

    def []=(key, value) 
    load_for_write! 
    super(key.to_s, value) 
    end 

por eso session[:test] y session["test"] devolverá el mismo valor en los carriles.

+1

El problema básico es que no desea convertir cadenas almacenadas en símbolos, ya que los símbolos no se recogen como basura. – Reactormonk

+1

una cosa que noté hoy. Mis valores de sesión son accesibles por cadenas, no por las teclas de símbolos. Mientras que los params también funcionan con símbolos. Estoy usando ruby ​​1.9.2 y rails 3.2.13 –

+0

El enlace 'string vs symbol' está roto: / – brandaemon

0

Sin ellos no son el mismo es una cadena que el otro es un símbolo

Se debe utilizar la segunda forma, un símbolo es algo que se usa para representar algo que de otro modo ser una cadena. Es una manera de tener nombres descriptivos de forma eficiente y, al mismo tiempo, de guardar el espacio que usaría para generar una cadena varias veces.

Esto significa que no crea una nueva instancia cada vez que se refiere al símbolo como lo haría con una cadena. El símbolo es simplemente una mejor manera de representar el valor que está describiendo.

Para completar, debo mencionar que un símbolo puede convertirse trivialmente en una cadena si necesita una representación más adelante.

si quiere leer más hay una larga publicación en el blog just here que explica bien los símbolos de rubí. Basta decir que son una optomización.

0

No, no son exactamente lo mismo. Son dos formas de lograr lo mismo.

En general, en Ruby, un uso principal de los símbolos es como claves. Los símbolos son :these_things. Las teclas hash son un uso típico para ellas ...

{ 
    :name => 'Mary', 
    :rank => 'Captain' 
} 

Las claves de sesión también suelen ser símbolos.

Usar cadenas en su lugar no dolerá nada, pero los símbolos son más típicos.