代码之家  ›  专栏  ›  技术社区  ›  Kaleb Brasee

正确使用Ruby语句修饰符

  •  6
  • Kaleb Brasee  · 技术社区  · 15 年前

    我刚刚开始使用Ruby,当RubyMine建议我更改此代码时,我发现了语句修饰符:

    if !VALID_DIRECTIONS.include?(direction)
       raise ArgumentError, "Invalid direction"
    end
    

    为此:

    raise ArgumentError, "Invalid direction" if !VALID_DIRECTIONS.include?(direction)
    

    是否有人因为使用语句修饰符而遇到麻烦,或者您觉得他们改进了您的代码?此外,是否有人有使用修改器的一般指南(即,对某些操作特别有效,或对某些其他操作无效)?

    4 回复  |  直到 15 年前
        1
  •  9
  •   Jörg W Mittag    15 年前

    我发现我通常在阅读这些尾随条件句(有时也称为尾随条件句)时不会遇到问题,只要 其他 代码可读性指导原则仍然得到遵守。将一个60个字符的表达式和一个40个字符的条件放在同一行上,您将得到一个100个字符的文本,这肯定是不可读的,完全独立于尾随条件的问题。

    必须 成为有条件的追随者。谁会愿意呢 raise ArgumentError

    此外,尾部条件句与数学和函数语言中的guard子句类似,后者也倾向于编写 他们守护的表情。

    最后但并非最不重要的一点是,在 raise Bar if foo return nil if quux 方法开头的表达式实际上是一种保护 好的 样式,以简化方法的控制流。再次:由于这些都是在方法的开始,很明显 作为条件,否则 return


    附言:我会用 unless 在那里,为了摆脱否定。在更复杂的情况下,我发现 除非 有时可能很难解析,但在本例中,它是 很明显,至少是IMHO。

        2
  •  8
  •   DataWraith    15 年前

    语句修饰符使ruby的行为更像英语,这很好:

    • 如果下雨,就呆在家里

    我建议你使用你认为最自然、最优雅的形式。如果有疑问,请大声读出两种形式的声明。就我个人而言,我倾向于只对短语句使用语句修饰符,例如 return :nope if input.nil?

        3
  •  4
  •   Doug Neiner    15 年前

    unless . 您的代码行可以(也许应该)编写为:

    raise ArgumentError, "Invalid direction" unless VALID_DIRECTIONS.include?(direction)
    
        4
  •  0
  •   Azeem.Butt    15 年前

    这纯粹是风格上的主观问题。使用任何你觉得舒服的东西。