正确使用Ruby语句修饰符

正确使用Ruby语句修饰符,ruby,statement-modifiers,Ruby,Statement Modifiers,我刚刚开始使用Ruby,当RubyMine建议我更改此代码时,我发现了语句修饰符: if !VALID_DIRECTIONS.include?(direction) raise ArgumentError, "Invalid direction" end 为此: raise ArgumentError, "Invalid direction" if !VALID_DIRECTIONS.include?(direction) 我喜欢它使代码更加简洁。然而,我可以一眼就看出它潜在的误导性,

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

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

raise ArgumentError, "Invalid direction" if !VALID_DIRECTIONS.include?(direction)
我喜欢它使代码更加简洁。然而,我可以一眼就看出它潜在的误导性,并强加了可读性问题,因为它将效果置于条件之前。再说一遍,也许这只是因为我太习惯C风格的语言了


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

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

一开始对我来说有点奇怪,但我不认为这会造成可读性问题。当经常使用Ruby时,它非常有意义。只有当我与其他语言来回切换时,它才是引人注目的。然而,当您沉浸在Ruby代码中时,您会发现它是编写单行条件语句的一种简洁明了的方法。另外,要习惯使用
,除非
。您的代码行可以(也许应该)编写为:

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

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

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

我建议你使用你认为最自然、最优雅的形式。如果有疑问,请大声读出两种形式的声明。就我个人而言,我倾向于只对短语句使用语句修饰符,例如
return:nope if input.nil?
——对于更长或更复杂的语句,读者可能需要更长的时间才能理解,因为眼睛只覆盖了一定的空间,所以有人只会在第二眼看到修饰符。

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

在您展示的特定代码示例中,很明显必须有一个条件跟随。谁会想
提出
一个
ArgumentError
而不先看一看参数

此外,尾部条件句类似于数学和函数语言中的guard子句,它们也倾向于在它们所保护的表达式之后编写

最后但并非最不重要的一点是,在方法的开始处放置两个
如果foo
升高条和
如果qux
表达式返回nil,作为一种保护,实际上被认为是很好的风格,以简化方法的控制流。再次强调:由于这些都是在方法的开头出现的,很明显必须有一个条件,否则
return
ing从方法的开头开始是没有意义的


PS:我实际上会使用
,除非那里有
,来消除否定。对于更复杂的条件,我发现
除非
有时很难解析,但在这种情况下,它更明显,至少在IMHO