正确使用Ruby语句修饰符

时间:2009-12-26 06:17:11

标签: ruby statement-modifiers

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

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

到此:

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

我喜欢它如何使代码更简洁。但是,我可以看到它乍一看可能具有误导性并强加可读性问题,因为它将效果置于条件之前。然后,也许那只是因为我已经习惯了C风格的语言。

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

4 个答案:

答案 0 :(得分:8)

声明修饰符使得ruby表现得更像英语,这很不错:

  • 如果下雨,待在家里
  • 如果下雨就待在家里

我建议你使用看起来最自然,最优雅的表格。如有疑问,请以两种形式大声朗读声明。就个人而言,我倾向于仅对return :nope if input.nil?这样的简短陈述使用陈述修饰语 - 对于更长或更复杂的陈述,它可以让读者更长时间地掌握,因为眼睛只能覆盖一定的空间,所以有人只会在第二眼看到修饰语。

答案 1 :(得分:8)

如果仍然遵循其他代码可读性指南,我发现我通常可以毫不费力地阅读这些尾随条件(因为它们有时被称为)。在同一行上放置一个60个字符的表达式和一个40个字符的条件,你最终会得到一个100个字符的文本,这肯定是不可读的,完全独立于尾随条件的问题。

在您展示的特定代码示例中,很明显必须是条件跟踪。谁不想先raise ArgumentError而不先看一下这些论点?

此外,尾随条件类似于数学和函数语言中的guard子句,它们也往往是在之后写入它们所守护的表达式。

最后但并非最不重要的一点是,在方法的开头放置几个raise Bar if fooreturn nil if quux表达式,作为一种防护,实际上被认为是良好的样式,以简化该方法的控制流程。再说一遍:因为这些都是在方法的开头,很明显是一个条件,否则return从方法的开头就没有意义了


PS:我实际上会在那里使用unless来摆脱否定。在更复杂的条件下,我发现unless有时很难解析,但在这种情况下,它显然是更多,至少是恕我直言。

答案 2 :(得分:4)

起初对我来说有点奇怪,但我不认为它会带来可读性问题。在Ruby中工作很多时,它非常有意义。只有当我与其他语言来回切换时,它才会引人注目。但是,当您沉浸在Ruby代码中时,您会发现它是编写一行条件的简洁方法。此外,习惯使用unless。你的代码行可能(也许应该)写成:

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

答案 3 :(得分:0)

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