1

正如标题所说。是否可以在 ruby​​ 的 here-doc 中使用 if/then 语句。

谢谢

4

3 回答 3

3

是的


irb(main):001:0> x = <<-E
irb(main):002:0" How
irb(main):003:0" now
irb(main):004:0" #{
irb(main):005:0"   if true
irb(main):006:0"     "brown"
irb(main):007:0"   else
irb(main):008:0"     "red"
irb(main):009:0"   end
irb(main):010:0" } cow
irb(main):011:0" E
=> "How\nnow\nbrown cow\n"
irb(main):012:0> puts x
How
now
brown cow
于 2010-11-18T00:43:16.470 回答
1

heredoc 就像一个字符串。因此,如果您的字符串允许变量评估和替换(不使用引号或双引号),您可以执行以下操作:

switcheroo=true
mydoc = <<HDOC
This string will always appear
#{"This will only appear if switcheroo is true" if switcheroo} 
HDOC

您必须将条件放在括号内,这是标准的字符串内评估技术。

另请注意,如果您的 heredoc 的引用使用单引号,这将不起作用,这意味着它是一个文字字符串。

于 2010-11-18T00:46:13.510 回答
1

比较(和对比)这些样本。哪个更易读,逻辑更清晰,你想支持吗?:

示例 #1:

string = <<END_STRING
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
#{
if (true_or_false)
  'jackdaws love my giant sphinx of quartz'
else
  'Sphinx of black quartz, judge my vow.'
end
}
proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem
ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
in culpa qui officia deserunt mollit anim id est laborum.
END_STRING

示例 #2:

string = <<END_STRING
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
#{
(true_or_false) \
  ?  'jackdaws love my giant sphinx of quartz' \
  : 'Sphinx of black quartz, judge my vow.'
}
proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem
ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
in culpa qui officia deserunt mollit anim id est laborum.
END_STRING

示例#3:

string = <<END_STRING
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
#{(true_or_false) ? 'jackdaws love my giant sphinx of quartz' : 'Sphinx of black quartz, judge my vow.'}
proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem
ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
in culpa qui officia deserunt mollit anim id est laborum.
END_STRING

示例 #4:

insert_string = (true_or_false) \
  ? 'jackdaws love my giant sphinx of quartz' \
  : 'Sphinx of black quartz, judge my vow.'

string = <<END_STRING
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
${ insert_string }
proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem
ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
in culpa qui officia deserunt mollit anim id est laborum.
END_STRING

我个人更喜欢#4,因为它将逻辑与字符串的定义分开,有助于更容易地看到正在发生的事情,但你的里程可能会有所不同。

于 2010-11-18T03:49:54.177 回答