Ruby: Diferença entre string e símbolo
最初の 2 つの問題は、Ruby (on Rails) のトラブルシューティングであり、
Vamos discutir ao longo do post os seguintes casos:
ガーダー ダドス Representar algum valor (do seu programa)
Com "guardar dados"sendo o caso de uso de strings, como por exemplo, registrar o nome de um livro.
O uso dos símbolos são otimizados quando precisamos Representativear um valor que existe em nosso programa, como em uma associação do ActiveRecord:
ou em key de uma Hash (também o uso da string para guardar um dado に注意):
Dois motivos!
O primeiro é que só pode haser uma instância de um símbolo. O que isso quer dizer é que se eu mencionar o símbolo
たとえば、以下を参照してください.
Eu terei certeza que
O que não acontece com strings, já que toda vez que você atribui o valor "teste"para novas variáveis, novas strings são criadas (ocupando memória extra do seu programa).
O segundo motivo é que símbolos são imutáveis. Não é possível alterar um símbolo como você faria com uma string: métodos como
Quando você precisa de todo o arsenal de métodos como o
Já quando o motivo érepresentar algo em seu código, como o nome de um metodo, ou o um valor dentro de uma Hash, シンボロスを利用.
アインダ混乱?心配しないで!方法
Você teria na verdade uma array de strings!
フォンテ: オルセン、ラッセン.雄弁なルビー
:
の時代を迎えたものでした.これは、「文字列と記号の違い」を説明するためのものです. Segui um bom tempo desenvolvendo código em Ruby sem ter entendido completamente a diferença entre essas duas classes, até que uma vez me deparei com um bug que foi causado por uma decisão entre símbolo e string!ポント デ パルティダ
Vamos discutir ao longo do post os seguintes casos:
Com "guardar dados"sendo o caso de uso de strings, como por exemplo, registrar o nome de um livro.
titulo = 'O senhor dos anéis'
E o segundo caso: como assim representar um valor?
O uso dos símbolos são otimizados quando precisamos Representativear um valor que existe em nosso programa, como em uma associação do ActiveRecord:
has_one :book
ou em key de uma Hash (também o uso da string para guardar um dado に注意):
hash = { name: "Vinicius" }
hash[:name]
=> "Vinicius"
Certo, mas por que símbolos são otimizados pra esse papel de "Representar um valor"?
Dois motivos!
O primeiro é que só pode haser uma instância de um símbolo. O que isso quer dizer é que se eu mencionar o símbolo
:name
duas vezes no mesmo código, vai ser semper o mesmo :name
.たとえば、以下を参照してください.
a = :teste
b = a
c = :teste
Eu terei certeza que
a
, b
e c
se referem ao mesmo object. Além disso, a velocidade de comparação entre símbolos é extremamente rápida!a == c # true
a === c # true
a.eql?(c) # true
a.equal?(c) # true
O que não acontece com strings, já que toda vez que você atribui o valor "teste"para novas variáveis, novas strings são criadas (ocupando memória extra do seu programa).
O segundo motivo é que símbolos são imutáveis. Não é possível alterar um símbolo como você faria com uma string: métodos como
upcase!
または capitalize!
não alteram o modificam.ベネフィシオ?これは、ソフトウェアの変更をサポートするためのものです (o que gera bugs difíceis de serem encontrados!).結論
Quando você precisa de todo o arsenal de métodos como o
upcase
, split
, ou outros, e o principal motivo é o de guardar um dado, seja um nome, data, etc. uma 文字列を使用してください!Já quando o motivo érepresentar algo em seu código, como o nome de um metodo, ou o um valor dentro de uma Hash, シンボロスを利用.
アインダ混乱?心配しないで!方法
public_methods
em uma versão pré-1.9 do Ruby e veja que até programadores experientes ainda se confundem as vezes em qual escolher. Como esse método retorna todos os métodos (públicos) de um object, você há de concordar que o correto seria public_methods
retornar uma array de símbolos, certo? Pois é, e nessas versões, se você fizesse:x = Object.new
puts x.public_methods
Você teria na verdade uma array de strings!
["inspect",
"pretty_print_cycle",
"pretty_print_inspect",
"clone",
...
]
フォンテ: オルセン、ラッセン.雄弁なルビー
Reference
この問題について(Ruby: Diferença entre string e símbolo), 我々は、より多くの情報をここで見つけました https://dev.to/viniciusuehara/ruby-diferenca-entre-string-e-simbolo-3ambテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol