¿Qué hace el comentario "cadena congelada literal: true"?


Este es el rspec binstub en el directorio de mi proyecto.

#!/usr/bin/env ruby
begin
  load File.expand_path("../spring", __FILE__)
rescue LoadError
end
# frozen_string_literal: true
#
# This file was generated by Bundler.
#
# The application 'rspec' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require "pathname"
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
  Pathname.new(__FILE__).realpath)

require "rubygems"
require "bundler/setup"

load Gem.bin_path("rspec-core", "rspec")

¿Qué pretende hacer esto?

# frozen_string_literal: true
Author: Dave Schweisguth, 2016-06-14

2 answers

# frozen_string_literal: true es un comentario mágico, soportado por primera vez en Ruby 2.3, que le dice a Ruby que todos los literales de cadena en el archivo están implícitamente congelados, como si #freeze hubiera sido llamado en cada uno de ellos. Es decir, si se define un literal de cadena en un archivo con este comentario, y llamas a un método en esa cadena que lo modifica, como <<, obtendrás RuntimeError: can't modify frozen String.

El comentario debe estar en la primera línea del archivo.

En Ruby 2.3, puedes usar este comentario mágico para prepararte para frozen los literales de cadena son los predeterminados en Ruby 3.

En Ruby 2.3 se ejecuta con la bandera --enable=frozen-string-literal, y en Ruby 3, los literales de cadena se congelan en todos los archivos. Puede anular la configuración global con # frozen_string_literal: false.

Si desea que un literal de cadena sea mutable independientemente de la configuración global o por archivo, puede prefijarlo con el operador unario + (teniendo cuidado con la precedencia del operador) o llamar a .dup en él:

# frozen_string_literal: true
"".frozen?
=> true
(+"").frozen?
=> false
"".dup.frozen?
=> false

También puede congelar una cadena mutable (descongelable) con unary -.

 151
Author: Dave Schweisguth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-15 02:19:31

En Ruby 3.0. Matz (el creador de Ruby) decidió congelar todos los literales de cadena por defecto.

Se puede usar en Ruby 2.x. Simplemente agregue este comentario en la primera línea de sus archivos.

# frozen_string_literal: true

El comentario anterior en la parte superior de un archivo cambia la semántica de la cadena estática literales en el archivo. Los literales de cadena estática se congelarán y siempre devuelve el mismo objeto. (La semántica de los literales de cadena dinámicos no ha cambiado.)

De esta manera tiene los siguientes beneficios:

No hay sufijo f feo. No hay error de sintaxis en Ruby antiguo. Sólo necesitamos una línea. para cada archivo.

Por favor, lea este tema para más información.

Https://bugs.ruby-lang.org/issues/8976

 2
Author: Alexandr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-17 11:31:57