使用字符串访问Ruby Hash值

时间:2014-08-08 04:44:19

标签: ruby-on-rails ruby

我有一个像下面的红宝石数组

tomcats = [
  'sandbox',
  'sandbox_acserver',
  'sandbox_vgw'
]

我需要将字符串作为哈希索引传递,如下面的

tomcats.each do |tomcat_name|
  obi_tomcat '#{tomcat_name}' do
    Chef::Log::info("Creating tomcat instance - #{tomcat_name}")
    Chef::Log::info("#{node['obi']['tomcat']['sandbox'][:name]}") // works
    Chef::Log::info("#{node['obi']['tomcat']['#{tomcat_name}'][:name]}") // doesn't work
  end
end

由于#{tomcat_name}的访问权限为nil,因此最后一个日志会引发错误。我是红宝石的新手。如何使用密钥作为tomcat_name

进行访问

3 个答案:

答案 0 :(得分:4)

在普通代码中,你会写:

node['obi']['tomcat'][tomcat_name][:name]

在字符串插值中(这里没用,因为在这种情况下它是字符串中唯一的东西),它完全相同:

"#{node['obi']['tomcat'][tomcat_name][:name]}"

答案 1 :(得分:2)

#{}仅适用于双引号,"#{tomcat_name}"

但是您不需要这里的语法,只需直接使用[tomcat_name]即可。

答案 2 :(得分:0)

当我看到这个问题时,我在想是否可以将ruby占位符放在字符串插值中的其他占位符中。我发现ruby实际上支持它,最有趣的是你不需要逃避字符串中的"

虽然在这种情况下它不是很有用,但如果你写如下,它仍然有效:

Chef::Log::info("#{node['obi']['tomcat']["#{tomcat_name}"][:name]}")

下面是占位符在其他占位符中的一个简单示例:

tomcats = [
  'sandbox',
  'sandbox_acserver',
  'sandbox_vgw'
]

node = {
    'sandbox_name' => "sandbox name",
    'sandbox_acserver_name' => "sandbox_acserver name",
    'sandbox_vgw_name' => "sandbox_vgw name",
}

tomcats.each do | tomcat |
    puts "This is tomcat : #{node["#{tomcat}_name"]}"
end