2

Puppet でカスタム タイプを作成しました (この例では簡略化しています)。このように使用すると( の2つのアイテムcollections)...

 my_type { "example1":
    ensure => present,
    collections => ["abc", "def"]
  }

...私のプロバイダーでresource[:collections]は、タイプはArrayです。それは良いことです。

しかし、collectionsアイテムが1つしか含まれていない場合...

 my_type { "example2":
    ensure => present,
    collections => ["abc"],
  }

...resource[:collections]は、String最も当惑させるものであり、対処するのは面倒です。

これは Ruby のことなのか、Puppet のことなのか (私はどちらも初めてです)、それとも私が偶然見つけたコーディングの宇宙の宇宙的なしわですか? さらに重要なことに、回避策はありますか? それとも、私はそれを間違っているだけですか?私は前にそれを言われたことがあります。我慢しないでください。

4

2 に答える 2

2

なぜこれが起こるのかはわかりませんが、配列または単一のオブジェクトのいずれかになる可能性があるものを処理するための標準的な回避策は、次のようにスプラット演算子を使用することです[*foo]。配列の場合foo、その要素は新しい要素に「分解」されるため、まだ配列があります。foo単なるオブジェクトだった場合は、1 つの要素の配列になります。

于 2011-08-19T06:54:57.183 に答える
0

それはRubyのことではありません。

resource = { :collection => ["abc"] }
resource[:collection].class
=> Array

Puppet DSL がその動作を変更するのは、結局のところ Ruby ベースであるため、少し奇妙に思えます。しかし、もしそうなら、マイケルズのアドバイスを受け入れることができます. 例:

[*resource[:collection]]
=> ["abc"]
resource[:str]="abc"
resource[:str]
=> "abc"
[*resource[:str]]
=> ["abc"]
于 2011-08-19T09:22:26.230 に答える