289 votes

Quel est le commentaire "frozen_string_literal: true"?

C'est l' rspec binstub dans mon répertoire de projet.

#!/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'est-ce que cela est censé faire?

# frozen_string_literal: true

385voto

Dave Schweisguth Points 5138

# frozen_string_literal: true magique pour un commentaire, pris en charge pour la première fois en Ruby 2.3, qui dit à Ruby que tous les littéraux de chaîne dans le fichier sont implicitement figé, comme si #freeze avait été appelé sur chacun d'eux. C'est, si un littéral de chaîne est définie dans un fichier avec ce commentaire, et vous appeler une méthode sur cette chaîne qui les modifie, comme <<, vous obtiendrez RuntimeError: can't modify frozen String.

Le commentaire doit être sur la première ligne du fichier.

En Ruby, 2.3, vous pouvez utiliser cette magie commentaire à préparer pour les surgelés littéraux de chaîne étant la valeur par défaut dans Ruby 3.

En Ruby 2.3 exécuter avec l' --enable=frozen-string-literal drapeau, et en Ruby 3, les littéraux de chaîne sont gelés dans tous les fichiers. Vous pouvez remplacer le paramètre par défaut avec # frozen_string_literal: false.

Si vous souhaitez un littéral de chaîne pour être mutable quel que soit le global ou par fichier de configuration, vous pouvez ajouter un préfixe avec le unaire + de l'opérateur (en étant prudent avec la priorité de l'opérateur) ou appelez - .dup sur:

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

Vous pouvez également congeler une mutable (réactualisé) chaîne avec unaire -.

32voto

Alexandr Points 262

En Ruby 3.0. Matz (Ruby créateur) a décidé de faire tous les littéraux de Chaîne de surgelés par défaut.

Vous pouvez utiliser Ruby 2.x. Il suffit d'ajouter ce commentaire dans la première ligne de vos fichiers.

# frozen_string_literal: true

Le commentaire ci-dessus en haut d'un fichier change la sémantique statique de la chaîne les littéraux dans le fichier. La statique des littéraux de chaîne sera gelé et retourne toujours sur le même objet. (La sémantique dynamique des littéraux de chaîne n'est pas modifié.)

De cette façon, a des avantages suivants:

Pas laid f-suffixe. Pas d'erreur de syntaxe sur les anciens Ruby. Nous avons besoin de seulement une ligne pour chaque fichier.

S'il vous plait, lisez cette rubrique pour plus d'informations.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X