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?
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).
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.
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:
Respostas:
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
:my_str
será criado apenas uma vezx
ey
apontará para a mesma área de memória. Por outro lado, se você tiveruma cadeia contendo
my_str
será criado por duas vezes , ex
ey
irá 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).
fonte
#mySymbol
.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
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.
fonte
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
:unsure
e: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
fonte