# frozen_string_literal: true
é um comentário mágico, suportado pela primeira vez no Ruby 2.3, que informa ao Ruby que todos os literais de string no arquivo estão implicitamente congelados, como se #freeze
tivessem sido chamados em cada um deles. Ou seja, se um literal de string for definido em um arquivo com esse comentário, e você chamar um método nessa string que a modifique, como <<
você obterá RuntimeError: can't modify frozen String
.
O comentário deve estar na primeira linha do arquivo.
No Ruby 2.3, você pode usar esse comentário mágico para se preparar para literais de string congelados, sendo o padrão no Ruby 3 .
No Ruby 2.3, execute o --enable=frozen-string-literal
sinalizador e , no Ruby 3, os literais de strings são congelados em todos os arquivos. Você pode substituir a configuração global por # frozen_string_literal: false
.
Se você deseja que uma literal de cadeia de caracteres seja mutável, independentemente da configuração global ou por arquivo, você pode prefixá-la com o +
operador unário (tomando cuidado com a precedência do operador) ou invocá .dup
-la:
# frozen_string_literal: true
"".frozen?
=> true
(+"").frozen?
=> false
"".dup.frozen?
=> false
Você também pode congelar uma sequência mutável (descongelada) com unária -
.
-"foo"
ser iguais"foo".freeze
? Quando eu verifico(-"foo").__id__
, recebo um valor diferente a cada vez, mas sempre o"foo".freeze.__id__
mesmo. Alguma ideia?-
é para desduplicar a String para economizar memória, além de retornar uma String congelada.Ele melhora o desempenho do aplicativo ao não alocar novo espaço para a mesma sequência, economizando tempo para tarefas de coleta de lixo. Quão? quando você congela uma string literal (objeto de string), você está dizendo ao Ruby para não permitir que nenhum de seus programas modifique a string literal (objeto).
Algumas observações óbvias a serem lembradas.
1. Ao congelar literais de string, você não está alocando novo espaço de memória para ele.
Exemplo:
Sem comentário mágico, aloca novo espaço para a mesma sequência (observe os diferentes IDs de objeto impressos)
Com comentários mágicos , o ruby aloca espaço apenas uma vez
2. Ao congelar literais de string, seu programa gerará uma exceção ao tentar modificar o literal de string.
Exemplo:
Sem comentário mágico , você pode modificar os literais da string.
Com o comentário mágico , uma exceção será gerada quando você modificar literais de string
Há sempre mais para aprender e ser flexível:
fonte
No Ruby 3.0. Matz (criador de Ruby) decidiu tornar todos os literais de String congelados por padrão.
Você pode usar no Ruby 2.x. Basta adicionar este comentário na primeira linha dos seus arquivos.
Por favor, leia este tópico para obter mais informações.
https://bugs.ruby-lang.org/issues/8976
fonte