Symbols vs Strings no Ruby

Fabiano Santos Florentino - Apr 5 '23 - - Dev Community

O que é símbolo(symbol) no Ruby?

Duas das perguntas mais comuns feitas aos desenvolvedores Ruby são “Qual é a diferença entre uma string e um símbolo?” e “Por que você usaria um símbolo em vez de uma string?

Sintaticamente, strings são qualquer texto escrito entre aspas (’isto é uma string’, ”isso também”, ”isso também!”), enquanto um símbolo é um texto que começa com dois pontos (:símbolo). Mas strings e símbolos têm funcionalidades diferentes que os tornam úteis para diferentes propósitos na programação.

Os símbolos Ruby são definidos como objetos de valor escalar usados como identificadores, mapeando strings imutáveis para valores internos fixos. Essencialmente, isso significa que os símbolos são strings imutáveis.

Na programação, um objeto imutável é algo que não pode ser alterado. Quando você cria um objeto imutável, ele permanecerá o mesmo até ser destruído

img1

No exemplo acima, consegui alterar o valor da variável string concatenando uma nova string a ela. Quando tentei fazer isso com a variável sym, recebi uma mensagem de erro de método indefinido, porque os símbolos são imutáveis.

Porque usar symbols ao invés de strings?

A natureza imutável dos símbolos os torna muito valiosos na programação porque objetos mutáveis podem causar bugs difíceis de detectar. Como os símbolos permanecem os mesmos, usá-los ajuda a evitar esse problema.

Outra diferença significativa entre strings e símbolos é como eles são armazenados na memória. Confira os IDs de objeto no exemplo abaixo

img2

Cada vez que uma string é escrita, ela cria um novo objeto com um novo lugar na memória, mesmo que a string seja textualmente idêntica a uma string existente. No entanto, como os símbolos são imutáveis, eles sempre se referem ao mesmo objeto e ao mesmo lugar na memória.

img3

Strings podem prejudicar o desempenho de um programa se objetos string forem criados e destruídos repetidamente quando o mesmo objeto poderia ter sido reutilizado em seu lugar. Por esse motivo, um programa que usa símbolos sobre strings (quando possível) será executado com mais eficiência.

Quando usar symbols?

O falecido guru do Ruby, Jim Weirich (esse cara era realmente um programador incrível. Ele inventou o Rack!) resumiu os diferentes usos para strings e símbolos: “Se o conteúdo textual do objeto for importante, use uma String. Se a identidade do objeto for importante, use um símbolo.”

Os símbolos são úteis quando você precisa de um identificador exclusivo para conter um valor, como uma chave em um hash. Se você usar strings como chaves de hash, terá os mesmos problemas com mutabilidade e memória (diferentes objetos/lugares na memória)

img4

As variáveis pessoa e pessoa2 têm chaves textualmente idênticas de "name", mas essas chaves têm IDs de objeto diferentes e ocupam lugares diferentes na memória. Isso seria um pesadelo em um programa de escala maior!

O uso de símbolos com hash keys elimina esse problema.

img5

Todas as chaves :name referem-se ao mesmo objeto na memória.

Observe a sintaxe diferente para usar símbolos como chaves de hash nas linhas 001 e 002. Isso é apenas um pouco de doce sintático do Ruby; as teclas são funcionalmente as mesmas. Em ambas as construções, você acessaria o valor com pessoa[:name] ou pessoa2[:name].

Símbolos são objetos que podem ser passados como qualquer outro objeto Ruby. Eles também podem ser usados para passar valores para métodos, como em métodos getter e setter em definições de classe.

img6

Estes são apenas alguns exemplos de quando usar símbolos em Ruby. Em caso de dúvida, se um valor não precisar ser alterado, use um símbolo em vez de uma string.

Tradução do artigo da autora Lindsay Criswell: https://medium.com/@lcriswell/ruby-symbols-vs-strings-248842529fd9

. . . . . . . . . . . . . . . . . . . . .
Terabox Video Player