Buscar..


Sintaxis

  • :símbolo
  • :'símbolo'
  • :"símbolo"
  • "símbolo" .to_sym
  • % s {símbolo}

Observaciones

Ventajas de usar símbolos sobre cadenas:

1. Un símbolo de Ruby es un objeto con comparación O (1)

Para comparar dos cadenas, potencialmente debemos mirar a cada personaje. Para dos cadenas de longitud N, esto requerirá N + 1 comparaciones

def string_compare str1, str2
  if str1.length != str2.length
        return false
  end
  for i in 0...str1.length
    return false if str1[i] != str2[i]
  end
  return true
end
string_compare "foobar", "foobar"

Pero dado que cada aparición de: foobar se refiere al mismo objeto, podemos comparar los símbolos mirando los ID de los objetos. Podemos hacer esto con una sola comparación. (O (1))

def symbol_compare sym1, sym2
  sym1.object_id == sym2.object_id
end
symbol_compare :foobar, :foobar

2. Un símbolo de Ruby es una etiqueta en una enumeración de forma libre

En C ++, podemos usar "enumeraciones" para representar familias de constantes relacionadas:

enum BugStatus { OPEN, CLOSED };
BugStatus original_status = OPEN;
BugStatus current_status  = CLOSED;

Pero debido a que Ruby es un lenguaje dinámico, no nos preocupamos por declarar un tipo de estado de error o por mantener un registro de los valores legales. En cambio, representamos los valores de enumeración como símbolos:

original_status = :open
current_status  = :closed

3. Un símbolo de rubí es un nombre constante y único.

En Ruby, podemos cambiar el contenido de una cadena:

"foobar"[0] = ?b # "boo"

Pero no podemos cambiar los contenidos de un símbolo:

:foobar[0]  = ?b # Raises an error

4. Un símbolo de Ruby es la palabra clave para un argumento de palabra clave

Al pasar argumentos de palabras clave a una función Ruby, especificamos las palabras clave usando símbolos:

# Build a URL for 'bug' using Rails.
url_for :controller => 'bug',
        :action => 'show',
        :id => bug.id

5. Un símbolo de rubí es una excelente opción para una clave hash

Normalmente, usaremos símbolos para representar las claves de una tabla hash:

options = {}
options[:auto_save]     = true
options[:show_comments] = false

Creando un símbolo

La forma más común de crear un objeto de Symbol es prefijando el identificador de cadena con dos puntos:

:a_symbol       # => :a_symbol
:a_symbol.class # => Symbol

Aquí hay algunas formas alternativas de definir un Symbol , en combinación con un literal de String :

:"a_symbol"
"a_symbol".to_sym

Los símbolos también tienen una secuencia %s que admite delimitadores arbitrarios similares a cómo funcionan %q y %Q para cadenas:

%s(a_symbol)
%s{a_symbol}

El %s es particularmente útil para crear un símbolo a partir de una entrada que contiene espacios en blanco:

%s{a symbol} # => :"a symbol"

Mientras que algunos símbolos interesantes ( :/ :[] :^ , etc.) se pueden crear con ciertos identificadores de cadena, tenga en cuenta que los símbolos no se pueden crear usando un identificador numérico:

:1 # => syntax error, unexpected tINTEGER, ...
:0.3 # => syntax error, unexpected tFLOAT, ...

Los símbolos pueden terminar con una sola ? o ! sin necesidad de usar una cadena literal como el identificador del símbolo:

:hello?  # :"hello?" is not necessary.
:world!  # :"world!" is not necessary.

Tenga en cuenta que todos estos métodos diferentes para crear símbolos devolverán el mismo objeto:

:symbol.object_id == "symbol".to_sym.object_id
:symbol.object_id == %s{symbol}.object_id

Desde Ruby 2.0 hay un atajo para crear una matriz de símbolos a partir de palabras:

%i(numerator denominator) == [:numerator, :denominator]

Convertir una cadena a un símbolo

Dada una String :

s = "something"

Hay varias formas de convertirlo en un Symbol :

s.to_sym
# => :something
:"#{s}"
# => :something

Convertir un símbolo en cadena

Dado un Symbol :

s = :something

La forma más sencilla de convertirlo en una String es mediante el uso del método Symbol#to_s :

s.to_s
# => "something"

Otra forma de hacerlo es utilizando el método Symbol#id2name , que es un alias para el método Symbol#to_s . Pero es un método que es exclusivo de la clase de Symbol :

s.id2name
# => "something"


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow