2010-12-03 6 views
1

Pouvez-vous mettre une déclaration conditionnelle dans un documentaire?Pouvez-vous mettre une déclaration conditionnelle dans un here-doc?

IE:

sky = 1 
str = <<EOF 
The sky is #{if sky == 1 then blue else green end} 
EOF 

Merci

+1

Vous pouvez le faire, mais il est bon de regarder au-delà de la capacité technique de le faire et de décider s'il est bon pour le code maintenabilité. Je préférerais voir le test conditionnel se produire en dehors du doc-doc, assigner à une variable, puis incorporer la variable dans l'affectation here-doc. Cela peut sembler une différence subtile dans cet exemple mais aide à mieux organiser le code au fur et à mesure qu'un programme se développe, un peu comme si on séparait la logique de l'affichage dans Rails ou autre MVC. –

Répondre

4

Oui, vous pouvez. (Avez-vous essayé?) HEREDOCs a déclaré que vous avez agi comme une chaîne entre guillemets. Si vous est arrivé de vouloir l'inverse, vous le feriez guillemet simple votre indicateur heredoc comme ceci:

str = <<EOF 
    #{ "this is interpolated Ruby code" } 
EOF 

str = <<'EOF' 
    #{ This is literal text } 
EOF 

Le « vert » et « bleu » dans votre exemple sont mauvais, sauf si vous avez des méthodes ou des variables locales avec les noms . Vous avez probablement voulu soit:

str = <<EOF 
    The sky is #{if sky==1 then 'blue' else 'green' end} 
EOF 

... ou la version terser:

str = <<EOF 
    The sky is #{sky==1 ? :blue : :green} 
end 

Comme toute interpolation de chaîne, le résultat de chaque expression a #to_s appelé là-dessus. Comme la représentation sous forme de chaîne d'un symbole est le même texte, l'utilisation de symboles en interpolation comme celle-ci permet d'enregistrer un caractère lors de la frappe. Je l'utilise le plus souvent comme:

cats = 13 
str = "I have #{cats} cat#{:s if cats!=1}" 
+0

Génial, fonctionne parfaitement! Besoin de quelque chose de similaire à "J'ai # {chats} cat # {: s if cats! = 1}". Merci! – Matt

+0

Et si j'ai le: bleu et: vert dans une variable? Dites un tableau couleurs [0], couleurs [1] etc. Comment l'heredoc changera-t-il? –

+0

@VijayDev Son code Ruby standard est entouré de '# {...}'; essayez ce que vous attendez de travailler et de voir. – Phrogz

Questions connexes