【问题标题】:Here-Docs with if then else statementHere-Docs with if then else 语句
【发布时间】:2011-05-11 18:27:12
【问题描述】:

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

谢谢

【问题讨论】:

  • 你可以,但我的问题是为什么?进行逻辑测试并在​​ here-doc 之外设置一个字符串变量,然后在其中使用 #{} 进行正常插值。这种方式不那么混乱,也更容易理解。
  • 原因是我需要判断一件事或另一件事是否正确。这是选择框的一些 html 文本。所以我需要根据传递给函数的内容来选择一些东西。 ruby 新手,所以我对它还不是很了解。

标签: ruby heredoc


【解决方案1】:

是的


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

【讨论】:

    【解决方案2】:

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

    示例 #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,因为它将逻辑与字符串的定义分开,有助于更轻松地查看正在发生的事情,但您的里程可能会有所不同。

    【讨论】:

    • 很高兴知道。我有一些类似于你的例子 4。虽然我需要做的不是在同一个地方插入一些东西。而且我不想用一个小改动写两次字符串,所以我只使用了两个变量。虽然工作正常。谢谢!
    【解决方案3】:

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

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

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

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

    【讨论】: