红宝石中的魔术评论(#编码:utf-8)如何?

How does the magic comment ( # Encoding: utf-8 ) in ruby?? work?

Ruby中的魔法评论如何?工作?我说的是:

1
# Encoding: utf-8

这是预处理指令吗?这种结构还有其他用途吗?


出于某种原因,人们将这一行称为"魔法评论"。在处理源代码解释器之前,读取此行并设置正确的编码。我相信,对于口译语言来说,这是很常见的。至少Python使用相同的方法。

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

1
2
3
# encoding: UTF-8
# coding: UTF-8
# -*- coding: UTF-8 -*-

在本文中,您可以阅读一些关于源代码编码的有趣内容。

我所知道的唯一一件类似的构造是shebang,但它一般与unix shell相关,并且不是特定于Ruby的。


这个神奇的注释告诉Ruby当前解析的文件的源代码。由于Ruby1.9.x默认假定US_ASCII,如果使用非ASCII字符(如umlauts或重音字符),那么您已经告诉解释器源代码的编码方式。

注释必须是要识别的文件的第一行(如果使用,则在shebang下面)。

还有其他编码设置。有关详细信息,请参阅此问题。

自2.0版以来,Ruby默认采用源文件的UTF-8编码。因此,如果您仍然使用UTF-8编写源代码,那么这种神奇的编码注释在野外就变得更加少见了。


正如您所指出的,magic注释是一个特殊的预处理构造。它们必须在文件的顶部定义(除非,如果顶部已经有一个unix shebang)。从Ruby2.3开始,有三种魔力评论:

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

更多信息:魔法指令