Проверьте, является ли переменная undef в кукольном шаблоне

Каков правильный способ проверить, является ли переменная undef в марионеточном шаблоне?

В манифесте переменная определяется следующим образом

$myvar = undef

Как это проверяется в шаблоне?

Я видел следующие два варианта:

<% if @myvar -%>
<% end -%>

а также

<% if not @myvar.nil? and @myvar -%>
<% end -%>

Они оба, похоже, работают в моем случае, но мне интересно, не срабатывает ли первый подход в определенных случаях?

Ответ 1

Документация Puppet (на момент написания этого ответа) объясняет это очень хорошо: https://puppet.com/docs/puppet/latest/lang_template_erb.html#concept-5365

Поскольку undef - это не то же самое, что false, просто использование if не является хорошим способом проверить это. Также, когда переменная определена, но имеет значение false или nil это также невозможно проверить с помощью простого if.

Вот почему вы хотите использовать scope.lookupvar('variable) и проверить его возвращаемое значение для :undef или :undefined (или nil), чтобы узнать, было ли оно установлено в undef или никогда не задано вообще.

Ответ 2

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

Я использую следующие правила:

Требуемая переменная

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

if $myvar == undef {
    fail {"You really must set myvar, seriously."}
}

if ! $anothervar {
    fail {"anothervar is false, undefined or empty."}
}

Вы можете сделать свою жизнь проще, задав тип параметров явно. Это избавляет вас от сравнения и преобразования.

В шаблоне вы просто записываете переменные:

<%= @myvar %>
<%= @anothervar %>

Необязательная переменная, которая должна быть определена

Если вы предполагаете, что переменная определена, вы можете рассматривать ее как логическую.

Отображение выглядит следующим образом (источник):

  • falsey: пустая строка, false, undef
  • правдивость: все остальное

В Puppet> = 4:

  • false: false, undef
  • правдивость: все остальное

Примеры:

напечатайте "что-то", если @myvar оценивает значение true, иначе "что-то еще".

<% if @myvar %>something<% else %>something else<% end %>

print 'something', если @myvar оценивает true

<% if @myvar %>something<% end %>

print @myvar, если он оценивает значение true, иначе 'alternative'%>

<%= @myvar ? @myvar : 'alternative'  %>

Необязательная переменная, которая может быть определена

Если вы не уверены, что переменная определена и не хотят делать неправильные предположения, проверьте ее в шаблоне.

Примеры:

напечатайте "что-то", за которым следует @myvar, если @myvar определен и не пуст

<% if defined?(@myvar) && ! @myvar.empty? %>something<%= @myvar %><% end %>

print @myvar, если он определен и больше 10

<%= @myvar if defined?(@myvar) && @myvar > 10 %>

Ответ 3

Первый должен работать как шарм, это то, чему учат и на курсах.

Номер два кажется... лишним.