【问题标题】:Why does YAML interpret '0777' as 511?为什么 YAML 将 '0777' 解释为 511?
【发布时间】:2015-10-16 10:33:07
【问题描述】:

在我的 YAML 文件中,我有:

foo:
  - '0777'

当我在我的代码 (result = YAML.load_file(...)) 中加载文件时,我得到了

result[:foo] = [511]

这发生在 Ubuntu 上。在 Mac 上是正确的 (["0777"])。更改为:

foo:
  - "'0777'"

它适用于 Ubuntu,但字符串包含引号:'0777'

为什么?

【问题讨论】:

  • 除了加载 YAML 文件之外,您的 Ruby 脚本还有其他功能吗?你是如何输出结果的?
  • @Wolfwyrd:不,在那个问题中,YAML 文档中有一个整数。在这里,它显然是一个以某种方式被双重解码为整数的字符串。这与 YAML 的语义无关,只是 YAML 解码器中的一个错误。

标签: ruby yaml


【解决方案1】:

在 Ruby 中,Integer 如果参数是字符串,并且恰好以 0x0b0 开头,则分别解释为十六进制、二进制、八进制字符串。

因此这里0777 被视为八进制字符串。从'0777' octal = '511' decimal 开始,您将得到511 作为结果。

reference

【讨论】:

  • 但是'0777'不是字符串,不是整数吗?
  • 我应该如何将其放入 .yml 文件中以使其成为字符串? "'0777'" 不是一个好主意,因为我得到了字符串中的引号 ('0777'),这是我不想要的(我想要 0777)。
  • 据我了解,如果您将其放在单引号 '' 中,如您的示例所示,则应将其视为字符串。我只能在没有'' 的情况下重现此问题。但是,如果不是这种情况,您可以尝试使用双引号 "0777"。 PS:老实说,我在这里胡乱猜测,因为我无法重现此问题。
  • 您的区别可能不是 Ubuntu 与 OSX,而​​是不同计算机上使用的不同 YAML gems/版本。确保您在两者上使用完全相同版本的 ruby​​?我的猜测是您在其中一个上遇到了 YAML 错误,但在另一个上没有错误的更新版本。 YAML 有时像这样的边缘问题是一场噩梦。
  • 嗯,问题是 为什么 它实际上是一个字符串时被视为八进制整数?必须进行某种双重解码,其中 YAML 被解码 两次,一次转换为字符串,然后再次将字符串解码为整数。这显然是一个错误。
猜你喜欢
  • 2017-08-01
  • 2020-08-27
  • 2018-10-12
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 2011-05-09
  • 2010-12-20
相关资源
最近更新 更多