JavaFree.org | RubyOnBr.org

string + e <<

Acompanhar string + e << 5 posts, 4 participantes

Avatar Neves 162 posts

Acabei de ver algo que não gostei muito no ruby, até porque ele era o responsável por um bug no meu código.

para minha surpresa, o operador << modificou a string que estava em nome (como de se esperar) mas também modificou a string em outro, o que na minha opinição quebra totalmente o conceito da “menor surpresa”.
Pra piorar:

Aqui achei que chamando to_s iria fazer uma cópia, mas não faz!

Agora veja que f*** seria achar o bug no seguinte código:

Imagina um código deste em um framework como Rails?
Ninguém espera que o conteúdo da sua variável seja alterada pela classe!

O que vcs acham?

 
Avatar antonio 196 posts

Não há nada de errado Neves.

O efeito do método to_s numa string é sempre retornar ‘self’ e não uma cópia. Se quer uma nova cópia(nova referência) use, o método dup.

 
Avatar c4r105x 45 posts

Provavelmente você está esquecendo que “isso” é um objeto, então se obj1 = obj2, os dois são o mesmo, apenas sendo duas referências para o mesmo objeto. entendeu?

 
Avatar Neves 162 posts

realmente é isto que confunde, pois não me lembro de ter visto string ser tratada como objeto em nenhuma outra linguagem.

 
Avatar Akita On Rails 295 posts

Isso porque nessas linguagens a string é imutável e é copiada quando você faz atribuição. Existem vantagens e desvantagens a isso. Java usa string imutáveis com operação de copy-on-write, então cada variável ganha uma nova instância copiada do string original. Em Ruby, String é mais um objeto e é passada a referência do objeto na atribuição. Apenas aprenda a semântica. Não existe um jeito “melhor” do que o outro. Se quiser deixar seu String “um pouco” imutável, chame o método freeze nele:

s = “teste”.freeze