Ruby: Diferença entre string e símbolo


最初の 2 つの問題は、Ruby (on Rails) のトラブルシューティングであり、: の時代を迎えたものでした.これは、「文字列と記号の違い」を説明するためのものです. 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:
  • ガーダー ダドス
  • 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.

    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",
    ...
    ]
    



    フォンテ: オルセン、ラッセン.雄弁なルビー