Saltar al contenido

Ruby: ¿Qué hace el comentario “frozen_string_literal: true”?

Solución:

# 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 había sido llamado a cada uno de ellos. Es decir, si se define un literal de cadena en un archivo con este comentario, y llama 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 prepararse para que los literales de cadena congelados sean los predeterminados en Ruby 3.

En Ruby 2.3 ejecute con el --enable=frozen-string-literal bandera, 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 unario + operador (teniendo cuidado con la precedencia del operador) o llamar .dup en eso:

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

También puede congelar una cuerda mutable (descongelada) con unario -.

Mejora el rendimiento de la aplicación al no asignar nuevo espacio para la misma cadena, lo que también ahorra tiempo para las tareas de recolección de basura. ¿Cómo? cuando congela un literal de cadena (objeto de cadena), le está diciendo a Ruby que no permita que ninguno de sus programas modifique el literal de cadena (objeto).

Algunas observaciones obvias a tener en cuenta.

1. Al congelar los literales de cadena, no le está asignando nuevo espacio de memoria.

Ejemplo:

Sin comentario mágico asigna nuevo espacio para la misma cadena (observe las diferentes ID de objeto impresas)

def hello_id
  a="hello"
  a.object_id
end

puts hello_id   #=> 70244568358640
puts hello_id   #=> 70244568358500

Con comentario mágico, ruby ​​asigna espacio solo una vez

# frozen_string_literal: true

def hello_id
  a="hello"
  a.object_id
end

puts hello_id   #=> 70244568358640
puts hello_id   #=> 70244568358640

2. Al congelar los literales de cadena, su programa generará una excepción cuando intente modificar el literal de cadena.

Ejemplo:

Sin comentario mágico, puede modificar los literales de cadena.

name="Johny"
name << ' Cash'

puts name     #=> Johny Cash

Con comentario mágico, se generará una excepción cuando modifique los literales de cadena

# frozen_string_literal: true

name="john"
name << ' cash'  #=> `<main>': can't modify frozen String (FrozenError)

puts name      

Siempre hay más para aprender y ser flexible:

  • https://bugs.ruby-lang.org/issues/8976
  • https://www.mikeperham.com/2018/02/28/ruby-optimization-with-one-magic-comment/

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

EDITAR 2019: decidió abandonar la idea de hacer que los literales de cadena congelados sean predeterminados para Ruby 3.0 (fuente: https://bugs.ruby-lang.org/issues/11473#note-53)


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 las cadenas literales estáticas en el archivo. Los literales de cadena estática se congelarán y siempre devolverán el mismo objeto. (La semántica de los literales de cadena dinámicos no cambia).

De esta manera tiene los siguientes beneficios:

Sin feo sufijo f. No hay error de sintaxis en Ruby más antiguo. Solo necesitamos una línea para cada archivo.

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

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *