2009-03-20 9 views
10

. . . como en este ejemplo:¿Por qué no puedo concatenar dos cadenas y asignarlas a un símbolo?

helloworld.rb:1: syntax error, unexpected '=', expecting $end 
:helloworld = "hello ".concat("world") 

pensé si uso concat estoy modificando la cadena "Hola" y añadir "mundo" a él y luego en última instancia, la asignación de la cadena resultante - "hola mundo" - a la: símbolo helloworld en el lado izquierdo del signo igual. Pensé que sería legal, al igual que si hubiera escrito:

:helloworld = "hello world" 

oh, espera, eso tampoco funciona. (se rasca la cabeza).

Respuesta

12

Prueba esto:

:"hello world" 
0

Bueno, sí. No puedes asignar a símbolos. ¿Te refieres a algo como:

foo = { :helloworld => "hello ".concat("world") } 

?

16

Los símbolos Ruby no pueden tener valores asignados, ya que representan un valor canónico. Si desea construir un símbolo a partir de una cadena, puede usar "hello" .concat ("world"). To_sym.

+0

Gracias. Sin embargo, ¿cómo me referiría a ese símbolo más adelante? ¿Tengo que decir siempre: "hello" .concat ("mundo"). To_sym –

+1

Hay un par de otras opciones. : "hello world" es el más directo, pero si el símbolo es desconocido hasta el tiempo de ejecución, puede almacenarlo en var: foo = "hello" .concat ("world"). to_sym. – dstnbrkr

+2

Incluso podría hacer algo como ':" # {"plan _"} # {: date} "' que daría como resultado ': plan_date', o lo que sea, dependiendo de la complejidad de su requerimiento. – mydoghasworms

7

Los símbolos son confusos cuando provienen de idiomas que no tienen nada parecido a ellos. No puedes asignarle símbolos, no es para eso.

Aquí hay un par de ejemplos que pueden ayudar a explicarlo.

5.times do |i| 
    # a new string is created in each iteration of the loop 
    puts "my string".object_id 

    # there is only ever one symbol for each possible value 
    # so a new object is not created during each iteration 
    puts :my_symbol.object_id 

    # this often makes a difference when you're using them for things like hash keys 
    #some_method(:name => 'bob') 
    #some_method('name' => 'bob') 
end 

La otra gran diferencia es que una comparación de símbolos es simplemente una comparación de punteros.

2

¿Quizás lo que estás buscando en realidad es una constante? Se pueden generar dinámicamente, se hace referencia a ellos más adelante, y obtienes una advertencia si tratas de reasignar uno.

>> HELLO_WORLD = "hello ".concat("world") 
=> "hello world" 
>> HELLO_WORLD = "foo" 
(irb):3: warning: already initialized constant HELLO_WORLD 
=> "foo" 
1

no se puede asignar a un símbolo, pero se puede volver un símbolo que es una concatenación de otros símbolos, a pesar de que tiene que pasar a través de las cadenas por lo que yo sé (Me gustaría saber si hay una mejor manera).

Suponga que desea obtener el símbolo :myway a partir de los símbolos :my y :way;

(:my.to_s + :way.to_s).to_sym # return :myway 
0
class Symbol 
    def + (to) 
    return "#{self}#{to}".to_sym 
    end 
end 
+2

La pregunta que se hizo específicamente sobre una explicación de por qué lo que el solicitante está intentando no funciona. – Cezar

0

Esto funcionó para mí

@foo = 'world' 
"hello #{@foo}".to_s.to_sym 

salida =>: "hola mundo"

Cuestiones relacionadas