Почему одиночные строки Puppet Arrays в моем коде ruby? - PullRequest
2 голосов
/ 19 августа 2011

Я создал собственный тип в 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, который больше всего сбивает с толку, и боль в заднице, с которой приходится иметь дело.

Является ли это рубиновым, марионеточным (я новичок в обоих) или просто какой-то космической складкой во вселенной кодирования, на которую я наткнулся? И что еще более важно, есть ли обходной путь? Или я просто делаю это неправильно? Мне уже говорили об этом раньше. Не сдерживайся.

Ответы [ 2 ]

2 голосов
/ 19 августа 2011

Несмотря на то, что я не могу сказать вам, почему это происходит, стандартный обходной путь для работы с вещами, которые могут быть как массивами, так и одиночными объектами, использует оператор splat так: [*foo]В случае, если foo был массивом, его элементы будут «взорваны» в новый, поэтому у вас все еще есть массив.Если foo был простым объектом, теперь у вас есть массив из одного элемента.

0 голосов
/ 19 августа 2011

Это не Ruby.

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

Кажется немного странным, если Puppet DSL изменит это поведение, поскольку в конце концов он основан на Ruby.Но если это действительно так, вы можете принять совет Майклса.Пример:

[*resource[:collection]]
=> ["abc"]
resource[:str]="abc"
resource[:str]
=> "abc"
[*resource[:str]]
=> ["abc"]
...