2017-08-11 5 views
1

をポピュレートノード属性を変更され、IはカスタムJSONフィールドを使用して層の属性が設定されている:スライスを使用!変数にOpsWorksスタック内の変数

{ 
    "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_を除外するより良い方法はありますか?

答えて

3

app_nameは、である。これは、メソッドの後ろのバグ!の理由です...そのメソッドがオブジェクトを突然変異させることに気づきます。

およびapp_nameおよびinstall_certs_app_nameは同じオブジェクトを参照しています。

sliceslice!はどちらも "app_"を返しますが、bangオブジェクトはスライスされたテキストを削除して呼び出し元を変更します。

あなたは

結果= install_certs_app_name.sliceを行った場合( 'がapp_') プットが を結果==>がapp_ がinstall_certs_app_nameを置く ! - >マネージャー

てみてください(代わりに)

install_certs_app_name = app_name.dup 
    install_certs_app_name.slice!('app_') 

したがって、2つの別々のオブジェクトがあります。

また、あなたは変数をスライスしたいと思います

install_certs_app_name = app_name.sub('app_', '') 
+0

より提案のためのks、@ SteveTurczyn! 私は過去に 'install_certs_app_name = app_name.slice( 'app _')'を試しましたが、奇妙なことに、rubyは、結果の文字列ではなく、削除された文字列の部分を返すようです。私は前に '.dup'を見たことがないので、試してみましょう。 – TorpedoBench

+0

それは働いています! '.dup'はそのトリックをするようです。 – TorpedoBench

+0

はい、私は雲の中に頭を抱えていました.. 'slice'と' slice! 'は常にスライスされたテキストを返します。' string = 'abc';結果= string.slice( 'a') 'および' string = 'abc'; result = string.slice!( 'a') 'どちらの場合でも' result'は "a"を持ちますが、2番目の例では 'string'のオブジェクトが変更されています。 – SteveTurczyn

1

app_nameinstall_certs_app_nameを割り当てても、同じオブジェクトを参照しています。新しいオブジェクトを作成するには、次のようにします。

install_certs_app_name = app_name.dup 

同じ値を持つ新しいオブジェクトが作成されます。 install_certs_app_nameスライスはapp_nameには影響しません。

2

場合は、あなたがよする非破壊バージョンです:

str.sliceなくstr.slice!

これらはしばしば言及されていますBangメソッドとして、変数を置き換えます。
以下は.downcaseメソッドの例です。これは.sliceと同じ原則です。

EDIT:
しかし、.slice戻ってカットされていますので、一部、あなただけ削除できapp_ -part .subよう

"app_manager".sub("app_",'') #=> "manager"

+0

ありがとう!私は非破壊的なメソッドを試しましたが、スライスは削除された文字列の一部を返すように見えます。残っている文字列ではありません。非破壊スライスに結果の文字列を返す適切な方法はありますか? – TorpedoBench

+0

ああ、別のオプションで私の答えを更新してみましょう。 –

+0

これはあなたのために働きますか@TorpedoBench –

関連する問題