2009-03-20 17 views
10

. . . come in questo esempio:Perché non concatenare due stringhe e assegnarle a un simbolo?

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

ho pensato che se io uso concat sto modificando la stringa "ciao" e aggiungendo "mondo" ad esso e quindi in ultima analisi assegnando la stringa risultante - "ciao mondo" - al: simbolo di helloworld sul lato sinistro del segno di uguale. Ho pensato che sarebbe stato legale, proprio come se avessi scritto:

:helloworld = "hello world" 

oh, aspetta, non funziona neanche. (graffia la testa).

risposta

12

Prova questo:

:"hello world" 
0

Beh, sì. Non puoi assegnare ai simboli. Intendi qualcosa del tipo:

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

?

16

I simboli Ruby non possono avere valori assegnati perché rappresentano un valore canonico. Se vuoi costruire un simbolo da una stringa, puoi usare "ciao" .concat ("mondo"). To_sym.

+0

Grazie. Come potrei fare riferimento a quel simbolo in seguito, però? Devo sempre dire: "ciao" .concat ("world"). To_sym –

+1

Ci sono un paio di altre opzioni. : "hello world" è il più diretto, ma se il simbolo è sconosciuto fino al runtime, è possibile memorizzarlo in una var: foo = "ciao" .concat ("world"). to_sym. – dstnbrkr

+2

Si potrebbe anche fare qualcosa come ':" # {"piano _"} # {: date} "' che risulterebbe in ': plan_date', o qualsiasi altra cosa, a seconda della complessità del proprio requisito. – mydoghasworms

7

i simboli sono confusi quando provengono da lingue che non hanno nulla di simile. Non puoi assegnare ai simboli, non è quello per cui sono.

Ecco alcuni esempi che possono aiutare a spiegarlo.

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 

L'altra grande differenza è che un confronto simbolo è semplicemente un confronto puntatore.

2

Forse quello che stai effettivamente cercando è una costante? Possono essere generati dinamicamente, a cui si fa riferimento in seguito, e si ottiene un avviso se si tenta di riassegnare uno.

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

Non è possibile assegnare a un simbolo, ma è possibile restituire un simbolo che è una concatenazione di altri simboli, anche se si deve passare attraverso le stringhe per quanto ne so (Mi piacerebbe sapere se c'è un modo migliore).

Supponiamo di voler ottenere il simbolo :myway a partire dai simboli :my e :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 domanda ha chiesto in particolare una spiegazione del motivo per cui ciò che il richiedente sta provando non funziona. – Cezar

0

questo ha lavorato per me

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

output =>: "Ciao mondo"

Problemi correlati