在OpsWorks堆栈的节点属性,我已使用自定义JSON字段中设置层属性:使用切片!上的变量被修改填充可变
{
"layer_apps" : [
"app_manager"
]
}
属性的app_
部分是必要的工作流程。有时候,我需要暂时删除一本食谱中的app_
部分。要做到这一点,我用slice!
:
node['layer_apps'].each do |app_name|
install_certs_app_name = app_name
install_certs_app_name.slice!('app_') # 'app_manager' => 'manager'
# snip
end
然而,一旦做到这一点,即使app_name
没有被直接修改,每个node['layer_apps']
属性被切成薄片,其进行后续的食谱,并导致故障。我期望的行为是slice!
将修改app_name
,而不是当前的node['layer_apps']
属性。认为app_name
是属性的链接,而不是它自己的变量,我试着将它的值赋给一个单独的变量(install_certs_app_name
和其他食谱中的类似变量),但行为持续存在。
这是Ruby/Chef中的预期行为吗?有没有更好的方法可以从属性中排除app_
前缀?
比ks的建议,@SteveTurczyn! 过去我曾尝试'install_certs_app_name = app_name.slice('app _')',但奇怪的是,ruby似乎返回被删除的字符串部分,而不是结果字符串。不过,我之前没有看过'.dup',所以我会试试看。 – TorpedoBench
它已经工作了! '.dup'似乎有诀窍。 – TorpedoBench
是的,我的头在云端......'slice'和'slice!'总是返回切片文本,所以'string ='abc'; result = string.slice('a')'和'string ='abc';结果= string.slice!('a')'在两种情况下'result'将具有“a”,但在第二个示例中,“string”中的对象被修改。 – SteveTurczyn