【问题标题】:YAML expression for an empty symbol空符号的 YAML 表达式
【发布时间】:2014-07-17 21:29:15
【问题描述】:

当我尝试在一个空符号上往返 YAML 时,它变成了不同的东西:

require "yaml"
YAML.load(:"".to_yaml) # => ":"
  1. 这是一个错误还是有意为之?
  2. 在 YAML 中表达空符号的正确方法是什么? yaml gem 提供以下信息:

    :"".to_yaml # => "--- ! ':'\n"
    

    这是正确的吗? (如果是,则说明从 YAML 到 Ruby 的过程中出现问题。如果不是,则说明从 Ruby 到 YAML 的过程中出现问题。)

字符串或非空符号往返成功:

YAML.load("".to_yaml)  # => ""
YAML.load("a".to_yaml) # => "a"
YAML.load(:a.to_yaml)  # => :a


更新

我刚刚将此作为错误报告给Ruby

【问题讨论】:

  • 这可能是一个错误? (评论,因为我不确定),但是使用 yaml gem 玩弄东西:YAML.load("--- :'' \n") # => :""
  • 这意味着 YAML 到 Ruby 工作正常,但 Ruby 到 YAML 不是。
  • 在 YAML 中使用符号时要小心,因为其他语言不支持它们。 YAML 应该是可移植的,所以我认为你遇到的是一个特定于 Ruby 的极端情况,我会犹豫不决。
  • @theTinMan 谢谢,我会记住这一点。但是 Ruby 应该选择返回错误、将其转换为带有警告的字符串,或者正确执行。
  • 我不确定“正确”是什么,因为根本不支持符号。我同意 Ruby 应该出于可移植性原因将其标记为错误,也许可以使用允许使用非可移植扩展(例如符号)的选项。

标签: ruby yaml symbols string


【解决方案1】:

在 YAML 中表达空符号的一种方法是 !ruby/symbol ,“符号”后面有一个空格。

YAML.load "!ruby/symbol "
# => :""

【讨论】:

  • 这可能是处理它的正确方法,因为 !ruby/symbol 是 YAML 处理特定语言或不可移植数据类型的方式。至少,生成方和解析方都有责任就如何处理达成一致。在我们编写的代码中,我指定必须将 Ruby 特定的数据对象强制转换为散列或字符串,以保持可移植性,从而回避了问题。我确实在 YAML 中使用了一些我们知道不会被任何其他语言访问的符号,但这些符号很少见。
猜你喜欢
  • 2020-09-12
  • 2014-01-10
  • 2022-08-11
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多