Sinceramente, eu também aprendi muito com o texto. Eu sabia quando utilizar os símbolos, mas não o porque.
Então segue abaixo o texto, qualquer crítica quanto à tradução, correção ou outro tipo de comentário será bem vindo. Lembrando que todos os créditos do texto são de Kevin Clark, o autor do original.
Para quem lê em inglês, este é o link do original:
http://glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols
Entendendo símbolos em Ruby
Símbolos em ruby são um enigma. Nós usamos eles, mas muitos não os entendem realmente.
Então, afinal, o que é um símbolo?
De uma forma simples, um símbolo é algo que você utiliza para representar nomes e strings. O que se resume a uma forma eficiente de ter nomes descritivos enquanto você economiza espaço que seria utilizado para gerar uma string para cada instância de nome.
O caso do Dr. Jones
Dr. Jones é um psicólogo. Ele regularmente usa testes de associações de palavras para diagnosticar pacientes e usa ruby para manter um registro de tudo. Seu primeiro paciente, Why, responde dessa maneira:
Dr J: Vermelho
Why: Ruby
Dr J: Transporte
Why: Rails
Dr J: Pedaçudo
Why: Bacon
Dr Jones cria um hash para armazenar seus dados:
why = {"vermelho" => "ruby", "transporte" => "rails", "pedaçudo" => "bacon"}O segundo paciente do Dr Jones, Bob, entrega os resultados de sua pesquisa:
bob = {"vermelho" => "pintar", "transporte" => "carro", "pedaçudo" => "gordo"}O problema
Depois de executar várias centenas de testes de associações de palavras, Dr. Jones começa a perceber que ele está estourando a memória! Num palpite, Jones executa testes no irb:
> paciente1 = {"ruby" => "vermelho"}
> paciente2 = {"ruby" => "programação"}
> paciente1.each_key {|key| puts key.object_id.to_s}
211006
> paciente2.each_key {|key| puts key.object_id.to_s}
203536Bem, vendo isso, cada vez que ele cria um hash para armazenar sua informação, o ruby cria um novo objeto string em uma diferente localização na memória para cada key. Felizmente, existe uma alternativa.
Símbolo ao resgate!
Diferente de strings, símbolos com um mesmo nome são inicializados e existem na memória uma única vez durante a sessão do ruby. Símbolos são obviamente mais úteis quando você reutiliza strings para representar alguma coisa. Reproduzindo o teste do Dr Jones, nós poderemos ver:
> paciente1 = { :ruby => "vermelho" }
> paciente2 = { :ruby => "programação" }
> paciente1.each_key {|key| puts key.object_id.to_s}
3918094
> paciente2.each_key {|key| puts key.object_id.to_s}
3918094Usando símbolos, nós utilizamos um único endereço de memória para representar a palavra ruby em nosso teste de associação de palavras. Ao longo do tempo, isso pode poupar bastante espaço.
Mas eu não sou um psiquiatra, quando mais eu vou querer usar símbolos?
Símbolos são úteis qualquer hora que você estiver reutilizando uma palavra várias e várias vezes para representar algo, seja ele uma chave em um hash ou o método que você está usando em uma http query.
Um exemplo, do último e melhor e melhor framework web Ruby on Rails, é seu uso de símbolos em rotas e links. O Rails define actions dentre os controllers para fazer coisas no framework antes de renderizar uma página web, então um link em Rails pode se parecer com algo assim:
link_to("Ver Artigo", :controller => "articles", :action => "show",Quando uma aplicação pode ter centenas de links, ou ao menos centenas de referências para diferentes actions e controllers, é significantemente mais eficiente utilizar símbolos do que strings.
Finalmente, é importante comentar que a utilidade dos símbolos não é restrita às keys em hashes. Por exemplo, se alguém for escrever um cliente ou servidor http ele pode utilizar get e post diversas vezes dentro da aplicação, e pode ser apropriado usar:
do_this if query == :get
...
send_message_to_server(:post,filename)Qualquer hora que uma string possa ser usada várias e várias vezes, um símbolo pode ser um bom candidato para substituição.


1 comentários:
Demais! Obrigado por postar.
Postar um comentário