Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用切片!在变量上修改填充变量的节点属性_Ruby_Chef Infra_Chef Recipe_Aws Opsworks - Fatal编程技术网

Ruby 使用切片!在变量上修改填充变量的节点属性

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!(“应用程序”)#“应用程序管理器”=>“管理器” #剪断 结束

在OpsWorks堆栈中,我使用自定义JSON字段设置了一个层属性:

{
  "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