Symbol x String

Qual a diferença em Ruby. Por exemplo:

a = Hash.new
a[‘aqui’] = ‘here’

puts a[:aqui] # => nil

???

puts “aqui” == "aqui # => nil

???

[quote=nadele]
Qual a diferença em Ruby. Por exemplo:

a = Hash.new
a[‘aqui’] = ‘here’

puts a[:aqui] # => nil

???[/quote]
Symbol não é automaticamente transformado em string, mas a[:aqui.to_s] retornaria “here”.

Symbols são úteis, especialmente como chaves de uma hash table, porque a implementação de <==> e hash deles é muito eficiente. Mas strings continuam sendo indispensáveis na hora de fazer I/O.

[quote=nadele]
puts “aqui” == "aqui # => nil

???[/quote]
“aqui” == “aqui” retorna true. O nil que você viu é o retorno do puts:

irb(main):001:0> puts "aqui" == "aqui" true => nil

Outra diferença é o object_id:

Se você tiver duas strings ‘tarso’, ambas terão ids diferentes.
Porém, o símbolo :tarso terá o mesmo object_id, não importando a parte do programa.

C:\java>irb
irb(main):001:0> puts "aqui" == :aqui
false
=> nil
irb(main):002:0> exit

No blog do akita tem um post sobre simbols bem esclarecedor.

http://www.akitaonrails.com/2007/11/26/ruby-symbols

symbols sao parecidas com Strings do java: sao imutaveis. otimo para usar como chave de hash (apesar de que, pelo que sei, se voce usar String como chave de hash no ruby, ele copia a String, para nao dar problema quando aquela String for alterada).

marcos@vacuo:~$ irb
irb(main):001:0> key = 'key'
=> "key"
irb(main):002:0> h = {key => "foobar"}
=> {"key"=>"foobar"}
irb(main):003:0> h[key]
=> "foobar"
irb(main):004:0> h['key']
=> "foobar"
irb(main):005:0> key = "anotherValue"
=> "anotherValue"
irb(main):006:0> h[key]
=> nil
irb(main):007:0> marcos@vacuo:~$

Um artigo sobre símbolos que eu vi no fórum do curso de Ruby on-line:

http://www.troubleshooters.com/codecorn/ruby/symbols.htm