2016-12-16 2 views
0

Я хочу, чтобы избежать того, что, кажется, огромное количество дублирования, которое используется в большинстве примеров марионеточных я видел:Получить все кукольный класс параметры

class foo(
    String arg1 = '', 
    String arg2 = '', 
    ... 
){ 
    if arg1 != '' { 
     ... 
    } 
    if arg2... 
} 

к чему-то более прагматичной, как

class foo(
    String arg1 = '', 
    String arg2 = '' 
){ 
    # [email protected] is like [email protected] in POSIX shell 
    [email protected] {|k, v| if k[v] != '' { contain $v } } 
} 
+2

Если ключи не важны, то аргумент не должен быть массивом, и вы просто используете 'содержать $ values' для включения всех этих классов? Пример выглядит немного надуманным, было бы полезно увидеть реальный манифест, чтобы дать лучший ответ. –

+0

Да, кажется, действительно непонятно, чего вы пытаетесь достичь здесь, рефакторинг булевых условностей в лямбда-итератор из-за отсутствия контента. –

+0

@DominicCleal \t Хороший пример: https://github.com/example42/control-repo/blob/production/site/profile/manifests/base/linux.pp, в частности, дублирование параметров для условных обозначений. – nwmcsween

ответ

1

Не существует конструкции, эквивалентной [email protected], о которой я знаю, поэтому я предлагаю помещать все данные в хэш вместо отдельных параметров. Существует не проверка параметров выполняется так один параметр с типом Hash[Enum['network', 'mail', '...'], String] будет вполне эквивалентно числу основных параметров Струнные, т.е.

class foo(
    String $pre_class, 
    Hash[Enum['network', 'mail'], String] $classes = {}, 
){ 

Поскольку вы даже не нужны ключи, используя все содержимое хэша будет достаточно. values() - это функция stdlib.

contain(values($classes)) 
Class[$pre_class] -> Class[values($classes)] 

Если вам необходимо удалить пустые значения, а затем использовать filter() function:

$filtered_classes = $classes.filter |$type_name, $class_name| { $class_name != '' } 

Я хотел бы добавить, что я не думаю, что данный класс является очень типичным модулем. Это профильный модуль и разработан как универсальный и многоразовый - вероятно, более типичный локально написанный модуль профиля не будет конфигурироваться до такой степени, когда имена классов задаются как значения параметров и будут иметь более жестко закодированное поведение.

Смежные вопросы