O que é um símbolo no Ruby?


45

Sou totalmente novo no mundo Ruby e estou um pouco confuso com o conceito de Símbolos. Qual é a diferença entre Símbolos e Variáveis? Por que não usar apenas variáveis?

Obrigado.


no Lisp - do qual Ruby é derivado - um símbolo é essencialmente o tipo de dados para uma variável; isso significa que você pode manipular o programa de maneira semelhante ao Reflection, enquanto ele é executado. (não a explicação mais coerente, sorry)
Paul Nathan

Respostas:


70

Variáveis ​​e símbolos são coisas diferentes. Uma variável aponta para diferentes tipos de dados. No Ruby, um símbolo é mais como uma string do que uma variável.

Em Ruby, uma string é mutável, enquanto um símbolo é imutável. Isso significa que apenas uma cópia de um símbolo precisa ser criada. Assim, se você tiver

x = :my_str
y = :my_str

:my_strserá criado apenas uma vez xe yapontará para a mesma área de memória. Por outro lado, se você tiver

x = "my_str"
y = "my_str"

uma cadeia contendo my_strserá criado por duas vezes , e xe yirá apontar para casos diferentes.

Como resultado, símbolos são frequentemente usados ​​como o equivalente a enumerações em Ruby, bem como chaves de um dicionário (hash).


1
Apenas para enfatizar o argumento de @ mipadi, quando você compara uma string, você precisa comparar todos os caracteres entre si. Portanto, comparar cadeias idênticas é O (n). Enquanto símbolos ruby ​​comparam referências a objetos, o que é O (1).
Jeremy Heiler

Por que o Python não tem isso?
Job

Você deve ter cuidado para não overuse-los também, uma vez que, passada eu sabia, mas eu não olhei para isso no ruby> 1,9, símbolos não se gc'd e assim pode comer a memória
frogstarr78

Eles se comportam de forma idêntica no Smalltalk, exceto que parecem #mySymbol.
precisa saber é o seguinte

@ frogstarr78 - A menos que você esteja gerando símbolos de forma programática (inserindo seqüências de caracteres sem verificá-las primeiro), você não precisa se preocupar em criar muitos símbolos.
Justin L.

16

Símbolo em Ruby é basicamente a mesma coisa que símbolo no mundo real. É usado para representar ou nomear algo.

Os símbolos são muito comumente usados ​​para representar algum tipo de estado, por exemplo

order.status = :canceled
order.status = :confirmed

Você também pode ver o símbolo como enumeração instantânea. Você não precisa definir um símbolo, apenas o usa. Este artigo explica detalhadamente.


1
Melhor explicação do que a maioria que eu pareço até agora.
Yuri Ghensev 10/08

0

Geralmente, variáveis ​​tendem a ser confundidas com strings, mas eu posso entender que você pensa que é uma variável. É compreensível. Pense desta maneira:

O status de um jogador em um jogo é representado por um número. 1 significa vivo, 2 significa inseguro, 3 significa morto. Isso pode ser facilmente substituído por símbolos. Os símbolos podem ser :alive :unsuree :dead. Para verificar se um jogador está vivo, em vez de fazer isso:

if player_status == 1

Você pode fazer isso:

if player_status == :alive

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.