Ruby Language
Simbolos
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"