ruby - 奇怪的 ruby​​ to_yaml 行为

标签 ruby yaml

由于 to_yaml 的行为差异,我遇到了这个奇怪的问题。对于:

"0111".to_yaml

它返回:

"--- \"0111\"\n"

同时这:

"0128".to_yaml

返回:

"--- 0128\n"

如您所见,第一个输出有 "" 但第二个没有。

有什么想法吗?

环境:MRI Ruby 1.9.2 和 JRuby 1.6.5(1.9 模式)。

最佳答案

我相信尤金对这些问题的原因是正确的——似乎解析器以不同的方式处理包含有效八进制数字的字符串。

如果您不喜欢它,您可以切换到不同的 YAML 解析器。根据docs有两个可用的解析器:SyckPsych。前者陈旧且无人维护,后者是其替代品。

Psych 用于最新版本的 Rails,并且是 1.9.3 中的默认 YAML 引擎。但是您可以在 1.9.2 中轻松使用它并查看不同之处:

require 'yaml'

p YAML::ENGINE.yamler      # => "syck"
# or explicitly set YAML::ENGINE.yamler = "syck" in 1.9.3
p '01'.to_yaml             # => "--- \"01\"\n"
p '08'.to_yaml             # => "--- 08\n"
p YAML.load('01'.to_yaml)  # => "01"
p YAML.load('08'.to_yaml)  # => "08"

p YAML::ENGINE.yamler = "psych"
p '01'.to_yaml             # => "--- '01'\n"
p '08'.to_yaml             # => "--- '08'\n"
p YAML.load('01'.to_yaml)  # => "01"
p YAML.load('08'.to_yaml)  # => "08"

如您所见,只要您使用相同的引擎解码数据(在这两种情况下都返回原始字符串),就无需担心 Syck 中字符串的不同表示形式。

如果出于某种原因你需要在 YAML 中统一表示字符串,你可以切换到 Psych(至少在这种情况下它更一致),但要小心,因为你可能会在尝试加载时遇到麻烦与之前使用 Syck 转储的 Psych 数据。

关于ruby - 奇怪的 ruby​​ to_yaml 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8725831/

相关文章:

ruby - LoadError on line ["51"] 尝试 compass 观察命令时

r - Conda:从github安装R包

ruby-on-rails - 发生异常时发送电子邮件不起作用,使用 exception_notification

ruby - Ruby 有像栈、队列、链表、映射或集合这样的容器吗?

python - 用于交易策略开发的脚本语言

azure - 无法使用 Azure DevOps 管道中设置的输出变量

c++ - 如何在 OpenCV 中以编程方式在 YAML 中编写注释?

ruby - 遍历父元素循环的子元素

ansible - 是否有更有效的方法来定位备份目录并将格式化列表保存到文件中?

python - 使用 ruamel.yaml 检索文档头部的注释