ruby中的魔术评论(#编码:utf-8)如何工作?

Les*_*nis 35 ruby encoding

红宝石中的神奇评论如何运作?我在说:

# Encoding: utf-8
Run Code Online (Sandbox Code Playgroud)

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

KL-*_*L-7 58

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

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

# encoding: UTF-8
# coding: UTF-8
# -*- coding: UTF-8 -*-
Run Code Online (Sandbox Code Playgroud)

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

我唯一知道的有类似构造的是shebang,但它通常与Unix shell有关,而不是特定于Ruby的.

  • 这样做是"神奇的",解释器通常会完全忽略注释.但是,此注释的存在/不存在具有意义,因此它是"魔术",因为解释器不会忽略它. (2认同)

Hol*_*ust 14

这个神奇的评论告诉Ruby当前解析文件的源编码.默认情况下,Ruby 1.9.x假设US_ASCII您已经告诉解释器,如果使用非ASCII字符(如变音符号或重音字符),源代码的编码是什么.

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

还有其他编码设置.有关更多信息,请参阅此问题.

从2.0版开始,Ruby默认采用源文件的UTF-8编码.因此,如果您使用UTF-8编写源代码,这种神奇的编码注释已成为一种罕见的视觉效果.


J-_*_*_-L 7

如你所知,魔术评论是一种特殊的预处理结构.它们必须在文件的顶部定义(除非顶部已经有unix shebang).从Ruby 2.3开始,有三种魔术评论:

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

更多信息:魔术指令