我有一个用于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)
答案 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_keys
(release notes),它也可以用来表示键,并且在Ruby核心中。
{'a' => 1, 'b' => 2}.transform_keys(&:to_sym)
#=> {:a=>1, :b=>2}
还有一个爆炸版本,该版本会更改哈希值,而不是创建一个新的哈希值。
答案 3 :(得分:0)
正如其他人已经指出的那样,symbolize_keys
是ActiveSupport
方法。如果您不使用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的其他依赖。