【问题标题】:Can you put a conditional statement inside a here-doc?你可以在 here-doc 中放置一个条件语句吗?
【发布时间】:2011-05-19 13:42:20
【问题描述】:

你能在 here-doc 中加入条件语句吗?

IE:

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

谢谢

【问题讨论】:

  • 你可以这样做,但是最好超越技术能力来确定它是否有利于代码的可维护性。我宁愿看到条件测试发生在 here-doc 之外,分配给一个变量,然后将变量嵌入到 here-doc 分配中。在这个例子中,这似乎是一个细微的差别,但有助于随着程序的增长更好地组织代码,有点像在 Rails 或其他 MVC 中将逻辑与显示分开。

标签: ruby heredoc


【解决方案1】:

是的,你可以。 (您尝试过吗?)声明为您的HEREDOCs 的行为就像一个双引号字符串。如果您碰巧想要反过来,您可以像这样单引号引用您的 HEREDOC 指标:

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

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

您的示例中的“绿色”和“蓝色”是错误的,除非您有具有这些名称的方法或局部变量。您可能想要:

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

...或者更简洁的版本:

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

与所有字符串插值一样,每个表达式的结果都调用了#to_s。由于符号的字符串表示是相同的文本,因此在插值中使用符号可以在键入时节省一个字符。我最常使用它:

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

【讨论】:

  • 太棒了,完美运行!需要类似于“我有#{cats} cat#{:s if cats!=1}”的东西。谢谢!
  • 如果我在某个变量中有 :blue 和 :green 怎么办?说一个数组colors[0],colors[1]等。heredoc将如何变化?
  • @VijayDev 这是包装在#{...} 中的标准Ruby 代码;尝试你希望工作和看到的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 2010-11-24
相关资源
最近更新 更多