Ruby脚本:加载YAML文件时未定义的方法`symbolize_keys'错误

时间:2018-08-16 19:58:23

标签: ruby scripting yaml

我有一个用于Yaml合并的ruby脚本,如下所示

#!/usr/bin/env ruby

require 'yaml'

raise "wrong number of parameters" unless ARGV.length == 2

y1 = YAML.load_file(ARGV[0]).symbolize_keys
y2 = YAML.load_file(ARGV[1]).symbolize_keys
puts y1.merge!(y2).to_yaml

执行时:

./test.rb ./src/api/config/config1.yml ./src/api/config/config2.yml

我遇到以下错误:

./test.rb:5:in `<main>': undefined method `symbolize_keys' for {"root"=>{"cloud.n2"=>{"accessKey"=>"I5VAJUYNR4AAKIZDH777"}}}:Hash (NoMethodError)

4 个答案:

答案 0 :(得分:4)

Hash#symbolize_keys方法来自activesupport gem(activesupport / lib / active_support / core_ext / hash / keys.rb)。

要使用它,您需要在脚本中添加以下行:

require "active_support"

答案 1 :(得分:2)

尽管其他答案/评论都是正确的,但为此要求全部DF <- structure(list(indiv = c("A", "B", "C"), lastseen = c(2L, 5L, 9L), d1 = c(2L, 2L, 1L), d2 = c(4L, 3L, 6L), d3 = c(5L, 5L, 9L ), d4 = c(8L, 7L, 11L), d5 = c(10L, 9L, 15L)), .Names = c("indiv", "lastseen", "d1", "d2", "d3", "d4", "d5"), class = "data.frame", row.names = c(NA, -3L)) 似乎过头了。而是使用:

ActiveSupport

或者,如果您可以控制yml文件,则只需在其中制作键符号并避免任何转换。例如

require 'active_support/core_ext/hash/keys' 

答案 2 :(得分:0)

这并不能真正回答您的问题,但是Ruby 2.5.0引入了Hash#transform_keysrelease notes),它也可以用来表示键,并且在Ruby核心中。

{'a' => 1, 'b' => 2}.transform_keys(&:to_sym)
#=> {:a=>1, :b=>2}

还有一个爆炸版本,该版本会更改哈希值,而不是创建一个新的哈希值。

答案 3 :(得分:0)

正如其他人已经指出的那样,symbolize_keysActiveSupport方法。如果您不使用ActiveSupport,和/或在不包含transform_keys的Ruby 2.5之前版本中,则可以自己定义。

class Hash

  def transform_keys
    return enum_for(:transform_keys) unless block_given?
    result = self.class.new
    each_key do |key|
      result[yield(key)] = self[key]
    end
    result
  end

  def transform_keys!
    return enum_for(:transform_keys!) unless block_given?
    keys.each do |key|
      self[yield(key)] = delete(key)
    end
    self
  end

  def symbolize_keys
    transform_keys{ |key| key.to_sym rescue key }
  end

  def symbolize_keys!
    transform_keys!{ |key| key.to_sym rescue key }
  end
end

这并不是说脚本可能不需要对Rails或ActiveSupport的其他依赖。