Ruby中的魔法注释(# Encoding: utf-8)是如何工作的?

38

魔法注释在 Ruby 中是如何工作的?我指的是:

# Encoding: utf-8

这是一个预处理指令吗?还有其他类似的用法吗?

4个回答

62

源文件顶部的Ruby解释器指令 - 这被称为魔法注释。在处理源代码之前,解释器读取此行并设置适当的编码。我相信这对于解释型语言来说很常见。至少Python使用了同样的方法。

您可以以多种不同的方式指定编码(其中一些是编辑器可识别的):

# encoding: UTF-8
# coding: UTF-8
# -*- coding: UTF-8 -*-
你可以在这篇文章中了解有关源编码的一些有趣内容。 我所知道的唯一类似的构造是shebang,但它与Unix shell有关,与Ruby无关。 在ruby/ruby中定义的魔法注释

1
在某些方面,这种构造类似于“魔术数字”。术语“魔术注释”似乎与此相关。 - Benjamin Oakes
2
这是一种“魔法”,因为通常情况下注释会被解释器完全忽略。然而,这个注释的存在或缺失有意义,因此它是“魔法”,因为解释器没有忽略它。 - NobodysNightmare
所有的Ruby脚本现在默认使用UTF-8编码。 - Alessandro De Simone
尽管我要指出的是,这意味着它们被假定为 utf-8 编码。如果文本编辑器将其保存为 8859-1 编码(正如许多编辑器默认情况下所做的那样),并且其中有 £ 等符号,则 Ruby 将会报错,因此当其中存在超出美国 ASCII 的字符时,文件必须由文本编辑器保存/编码为 utf-8。 - barlop

15

这个神奇的注释告诉Ruby当前解析文件的源编码。由于Ruby 1.9.x默认假定为US_ASCII,如果您使用非ASCII字符(如umlauts或带重音符号的字符),则必须告诉解释器源代码的编码。

这个注释必须是文件的第一行(或在shebang之下,如果使用的话),才能被识别。

还有其他的编码设置。更多信息请参见这个问题

从2.0版本开始,Ruby默认假定源文件采用UTF-8编码。因此,如果您已经用UTF-8编写了源代码,则这个神奇的编码注释在实践中变得越来越少见。


8

正如您所指出的,魔法注释是一种特殊的预处理结构。它们必须在文件顶部定义(除非已经有unix shebang在顶部)。从Ruby 2.3开始,有三种类型的魔法注释:

  • 编码注释:请参见其他答案。必须始终是第一个魔法注释。必须与ASCII兼容。设置源编码,因此如果文件的实际编码与指定的编码不匹配,则会遇到问题
  • frozen_string_literal: true:冻结当前文件中的所有字符串字面量
  • warn_indent: true:激活当前文件的缩进警告

更多信息:魔法说明


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接