我有一个像下面的红宝石数组
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
?
答案 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