Question Vérifier si une variable est undef dans le modèle de marionnette


Quelle est la bonne façon de vérifier si une variable est indéfinie dans un modèle de marionnette?

Dans le manifeste, la variable est définie comme suit

$myvar = undef

Comment cela est-il vérifié dans le modèle?

Est vu les deux variantes suivantes

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

et

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

Ils semblent tous deux fonctionner dans mon cas, mais je me demande si la première approche échoue dans certains cas?


15
2018-06-13 20:56


origine


Réponses:


La documentation de la marionnette (au moment d'écrire cette réponse) l'explique très bien: https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html#testing-for-undefined-variables

Depuis undef n'est pas la même que false, juste en utilisant un if n'est pas un bon moyen de vérifier cela. Aussi quand une variable est définie, mais a une valeur de false ou nil il est également impossible de vérifier avec un simple if.

C'est pourquoi vous voulez utiliser scope.lookupvar(‘variable’) et vérifier sa valeur de retour pour :undef ou :undefined (ou nil) pour savoir si elle était réglée sur undef, ou jamais du tout.


6
2017-07-13 16:08



Le premier devrait fonctionner comme un charme, c'est aussi ce qui est enseigné dans les cours.

Le numéro deux semble ... redondant.


2
2018-06-14 05:09



Je dirais que la vérification dépend si vous voulez une alternative lorsque la variable n'est pas définie.

J'utilise les règles suivantes:

Variable requise

Vérifiez dans votre script de marionnette si la variable contient la valeur attendue avant même d’envisager le rendu du modèle:

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

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

Vous pouvez vous simplifier la vie en définissant explicitement le type de paramètres. Cela vous évite de taper des comparaisons et des conversions.

Dans votre modèle, vous écrivez simplement les variables:

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

Variable optionnelle à définir

Si vous supposez que la variable est définie, vous pouvez la traiter comme étant booléenne.

Le mappage est le suivant (la source):

  • falsey: chaîne vide, false, undef
  • la vérité: tout le reste

Dans la marionnette> = 4:

  • falsey: faux, undef
  • la vérité: tout le reste

Exemples:

imprime "quelque chose" si @myvar donne la valeur true, sinon "quelque chose d'autre".

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

imprimer "quelque chose" si @myvar est évalué à true

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

affichez @myvar s'il est évalué à true, sinon 'alternative'%>

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

Variable optionnelle pouvant être définie

Si vous n'êtes pas certain qu'une variable est même définie et que vous ne voulez pas faire de suppositions erronées, vérifiez-la dans le modèle.

Exemples:

Imprimer 'quelque chose' suivi de @myvar si @myvar est défini et non vide

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

imprimer @myvar s'il est défini et supérieur à 10

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

2
2017-12-07 09:44