Ruby脚本:未定义的方法“symbol#u键';加载YAML文件时出错
我有一个用于yaml合并的ruby脚本,如下所示Ruby脚本:未定义的方法“symbol#u键';加载YAML文件时出错,ruby,scripting,yaml,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 当我执行它时: ./te
#!/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)
/test.rb:5:in`':未定义的{“root”=>{“cloud.n2”=>{“accessKey”=>“I5VAJUYNR4AAKIZDH777”}}的方法`符号化}:散列(NoMethodError)
方法来自activesupport
gem(activesupport/lib/active\u support/core\u ext/hash/keys.rb)
为了使用它,您需要在脚本中添加以下行:
require "active_support"
虽然其他答案/评论都是正确的,但要求所有的
ActiveSupport
来实现这一点似乎有些过分。相反,请使用:
require 'active_support/core_ext/hash/keys'
或者,如果您可以控制yml文件,则只需在其中创建键符号,并避免任何转换。比如说
require 'yaml'
yml = <<YML
:root:
:cloud.n2:
:accessKey: "I5VAJUYNR4AAKIZDH777"
YML
YAML.load(yml)
#=> {:root=>{:"cloud.n2"=>{:accessKey=>"I5VAJUYNR4AAKIZDH777"}}}
需要“yaml”
yml={:“cloud.n2”=>{:accessKey=>“I5VAJUYNR4AAKIZDH777”}}
这并不能真正回答您的问题,但是引入了Ruby 2.5.0(),它也可以用来表示键,并且是核心Ruby
{'a' => 1, 'b' => 2}.transform_keys(&:to_sym)
#=> {:a=>1, :b=>2}
还有一个bang版本,它改变了散列,而不是创建一个新的散列。正如其他人已经指出的,
symbol\u keys
是一种ActiveSupport
方法。如果您没有使用ActiveSupport
,和/或在不包含transform\u键的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的依赖关系。是否安装了Rails?symbol\u key
来自Rails中的ActiveSupport。您还需要活动支持。