我在Puppet中创建了一个自定义类型(本例简化)。如果我像这样使用它(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的东西(我是两者都是新手)还是我偶然发现的编码世界中的一些宇宙皱纹?更重要的是,有解决方法吗?或者我只是做错了?我之前被告知过。不要退缩。
答案 0 :(得分:2)
虽然我无法告诉你为什么会发生这种情况,处理可能是数组或单个对象的事情的标准解决方法是使用splat运算符,如下所示:[*foo]
。如果foo
是一个数组,它的元素将“爆炸”成一个新数组,所以你仍然有一个数组。如果foo
只是一个普通对象,那么现在你有一个单元素数组。
答案 1 :(得分:0)
这不是Ruby的事情。
resource = { :collection => ["abc"] }
resource[:collection].class
=> Array
如果Puppet DSL会改变这种行为似乎有点奇怪,因为它毕竟是基于Ruby的。但如果确实如此,你可以接受迈克尔斯的建议。例如:
[*resource[:collection]]
=> ["abc"]
resource[:str]="abc"
resource[:str]
=> "abc"
[*resource[:str]]
=> ["abc"]