无法读取和绑定 ruby 中的 yml 数据

Trouble reading and binding yml data in ruby

我有一个包含以下内容的 yaml 文件:

:common
  :substitue
    :foo: fee

我读这些数据是这样的:

data = YAML.load(erb_data[File.basename(__FILE__, '.*')].result(binding))

common = data[:common]

def substitute_if_needed(original_value)
    mapping = common.dig(:substitue, original_value)
    if mapping.nil? ? original_value : mapping
end

不幸的是,这没有进行我想要的替换。我想打电话给 substitute_if_needed('foo') 并让 'fee' 回来。我也想打电话给 substitute_if_needed('bar') 并取回 'bar'。

我该怎么做?

你的代码有几个问题:

  1. YAML 示例看起来有问题。正确的应如下所示:
common:
  substitute:
    foo: fee
  1. 您正在尝试使用符号作为键来获取 common = data[:common] 中的 common 键,但它应该是一个字符串 (data["common"])。另外,我认为将获取逻辑分成两部分是个坏主意 - 首先将 "common" 提取到 substitute_when_needed 之外,然后将 dig 提取到其中。

  2. if 语句已损坏。它应该是正确的 if 或正确的三元运算符。

解决所有这些问题会给我们带来类似的东西(为了方便,我刚刚用 StringIO 替换了一个文件 - 使代码段按原样可执行):

yaml = StringIO.new(<<~DATA)
  common:
    substitute:
      foo: fee
DATA

def substitute_if_needed(data, original_value)
  mapping = data.dig("common", "substitute", original_value)
  mapping.nil? ? original_value : mapping
end

data = YAML.load(yaml)

substitute_if_needed(data, "foo") # => "fee"
substitute_if_needed(data, "bar") # => "bar"