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.

wassimans
fonte
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).

mipadi
fonte
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.

Jakub Arnold
fonte
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

sirsnow
fonte