Sou totalmente novo no mundo Ruby e um pouco confuso com o conceito de Símbolos. Qual é a diferença entre símbolos e variáveis? Por que não apenas usando variáveis?
Obrigado.
Comentários
- em Lisp – do qual Ruby é derivado – um símbolo é essencialmente o tipo de dados de uma variável; isso significa que você pode manipular o programa em um estilo de reflexão enquanto ele é executado. (não a explicação mais coerente, desculpe)
Resposta
Variáveis e símbolos são coisas diferentes. Uma variável aponta para diferentes tipos de dados. Em Ruby, um símbolo é mais parecido com uma string do que com 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. Portanto, se você ter
x = :my_str y = :my_str
:my_str
será criado apenas uma vez e x
e y
apontam para a mesma área da memória. Por outro lado, se você tiver
x = "my_str" y = "my_str"
a string contém ing my_str
será criado duas vezes e x
e y
apontará para instâncias diferentes.
Como resultado, os símbolos são freqüentemente usados como equivalentes a enums em Ruby, bem como chaves para um dicionário (hash).
Comentários
- Basta pressionar @mipadi ' s ponto, ao comparar uma string, você precisa comparar todos os caracteres entre si. Portanto, comparar strings idênticas é O (n). Enquanto os símbolos do rubi comparam referências de objetos que são O (1).
- Por que o Python não tem isso?
- Você deve ter cuidado para não abusar deles também, já que, pelo que sei, mas eu não ' t olhei para isso em ruby > 1.9, símbolos don ' t get gc ' de pode consumir memória
- Eles se comportam de forma idêntica em Smalltalk, exceto que se parecem com
#mySymbol
. - @ frogstarr78 – A menos que você esteja gerando símbolos de maneira programática (internando strings sem verificá-los primeiro), você não ' não precisa se preocupar em fazer muitos símbolos.
Resposta
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 enum instantâneo. Você não precisa definir um símbolo, basta usá-lo. Este artigo o explica em detalhes.
Comentários
- Explicação melhor do que a maioria ' que pareço até agora.
Resposta
Normalmente, as variáveis tendem a ser confundidas com strings, mas posso entender que você pense nisso como uma variável. É compreensível. Pense desta forma:
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