为什么我的ruby代码中有单例Puppet Arrays字符串?

时间:2011-08-19 04:37:43

标签: ruby puppet

我在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的东西(我是两者都是新手)还是我偶然发现的编码世界中的一些宇宙皱纹?更重要的是,有解决方法吗?或者我只是做错了?我之前被告知过。不要退缩。

2 个答案:

答案 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"]