Ruby 使用切片!在变量上修改填充变量的节点属性
在OpsWorks堆栈中,我使用自定义JSON字段设置了一个层属性:Ruby 使用切片!在变量上修改填充变量的节点属性,ruby,chef-infra,chef-recipe,aws-opsworks,Ruby,Chef Infra,Chef Recipe,Aws Opsworks,在OpsWorks堆栈中,我使用自定义JSON字段设置了一个层属性: { "layer_apps" : [ "app_manager" ] } 该属性的app部分对于工作流是必需的。有时,我需要临时删除烹饪书中的app\uu部分。为此,我使用slice: 节点['layer_apps'],每个节点都有| app_名称| 安装\证书\应用\名称=应用\名称 安装\u certs\u app\u name.slice!(“应用程序”)#“应用程序管理器”=>“管理器” #剪断 结束
{
"layer_apps" : [
"app_manager"
]
}
该属性的app
部分对于工作流是必需的。有时,我需要临时删除烹饪书中的app\uu
部分。为此,我使用slice代码>:
节点['layer_apps'],每个节点都有| app_名称|
安装\证书\应用\名称=应用\名称
安装\u certs\u app\u name.slice!(“应用程序”)#“应用程序管理器”=>“管理器”
#剪断
结束
但是,一旦完成此操作,即使没有直接修改app\u name
,每个节点['layer\u apps']
属性都会被切片,这会继续到后续的烹饪书中并导致失败。我期望的行为是切片
将修改app\u name
,而不是当前的节点['layer\u apps']
属性。考虑到app\u name
是属性的链接,而不是它自己的变量,我尝试将其值分配给一个单独的变量(install\u certs\u app\u name
和其他烹饪书中类似的变量),但这种行为仍然存在
这是Ruby/Chef的预期行为吗?当您将app\u name
分配给install\u certs\u app\u name
时,是否有更好的方法将app\u前缀从属性中排除?您仍然引用同一对象。要创建新对象,可以执行以下操作:
install_certs_app_name = app_name.dup
将创建具有相同值的新对象。而切片install\u certs\u app\u name
不会以这种方式影响app\u name
。当您将app\u name
分配给install\u certs\u app\u name
时,您仍然引用同一对象。要创建新对象,可以执行以下操作:
install_certs_app_name = app_name.dup
将创建具有相同值的新对象。而切片install\u certs\u app\u name
不会以这种方式影响app\u name
。app\u name
正在被直接修改。这就是爆炸的原因代码>在方法之后。。。这样您就知道该方法会改变对象
和app\u name
和install\u certs\u app\u name
正在引用同一对象
请注意slice
和slice
两者都返回“app_2;”,但是bang对象通过删除切片文本来改变调用者
如果是的话
结果=安装\u证书\u应用程序\u name.slice!(“应用程序”)
结果
==>应用程序_
将安装\证书\应用\名称放入
-->经理
试试看(取而代之)
所以你有两个独立的对象
或者
install_certs_app_name = app_name.sub('app_', '')
正在直接修改app_name
。这就是爆炸的原因代码>在方法之后。。。这样您就知道该方法会改变对象
和app\u name
和install\u certs\u app\u name
正在引用同一对象
请注意slice
和slice
两者都返回“app_2;”,但是bang对象通过删除切片文本来改变调用者
如果是的话
结果=安装\u证书\u应用程序\u name.slice!(“应用程序”)
结果
==>应用程序_
将安装\证书\应用\名称放入
-->经理
试试看(取而代之)
所以你有两个独立的对象
或者
install_certs_app_name = app_name.sub('app_', '')
如果您希望对变量进行切片,您需要的是非破坏性版本:
str.slice
而不是str.slice代码>
这些方法通常被称为Bang方法,并将变量替换到位。
下面是一个使用.downcase
方法的示例。这与.slice
的原理相同
编辑:
但是,由于.slice
返回已剪切的零件,因此您只需删除应用程序
-part.sub
即可
“应用程序管理器”。sub(“应用程序管理器”,“应用程序管理器”=>“管理器”
如果您希望对变量进行切片,您需要的是非破坏性版本:
str.slice
而不是str.slice代码>
这些方法通常被称为Bang方法,并将变量替换到位。
下面是一个使用.downcase
方法的示例。这与.slice
的原理相同
编辑:
但是,由于.slice
返回已剪切的零件,因此您只需删除应用程序
-part.sub
即可
“应用程序管理器”。sub(“应用程序管理器”,“应用程序管理器”=>“管理器”
谢谢你的建议,@SteveTurczyn!过去我确实尝试过install\u certs\u app\u name=app\u name.slice('app\u')
,但奇怪的是,ruby似乎返回了被删除的字符串部分,而不是结果字符串。不过,我以前没有看过.dup
,所以我会试试看。是的,我的脑袋进水了<代码>切片
和切片代码>始终返回切片文本,因此字符串='abc';结果=string.slice('a')
和string='abc';结果=string.slice!('a')
在这两种情况下,结果
都将有“a”,但在第二个示例中,字符串
中的对象被修改。感谢您的建议,@SteveTurczyn!过去我确实尝试过install\u certs\u app\u name=app\u name.slice('app\u')
,但奇怪的是,ruby似乎返回了被删除的字符串部分,而不是结果字符串。不过,我以前没有看过.dup
,所以我会试试看。是的,我的脑袋进水了<代码>切片
和切片代码>始终返回切片文本,因此字符串='abc';结果=string.slice('a')
和string='abc';结果=string.slice!('a')
在这两种情况下,result
都将有“a”,但在第二个示例中,string
中的对象被修改。谢谢!我确实尝试了非破坏性的方法,但slice似乎特别返回被删除的字符串部分,而不是剩余的字符串。是否有适当的方法让无损切片返回resu