首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >正确使用Ruby语句修饰符

正确使用Ruby语句修饰符
EN

Stack Overflow用户
提问于 2009-12-26 06:17:11
回答 4查看 4.6K关注 0票数 7

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if !VALID_DIRECTIONS.include?(direction)
   raise ArgumentError, "Invalid direction"
end

要这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
raise ArgumentError, "Invalid direction" if !VALID_DIRECTIONS.include?(direction)

我喜欢它使代码更简洁的方式。然而,我可以看到它乍一看可能会产生误导,并带来可读性问题,因为它将效果放在了条件之前。话又说回来,也许这只是因为我太习惯C风格的语言了。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-26 09:37:10

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

在您所展示的特定代码示例中,很明显必须有一个条件后跟。谁会想不先看一下参数就对ArgumentError执行raise操作呢?

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

最后但并非最不重要的一点是,将两个raise Bar if fooreturn nil if quux表达式放在方法的开头,作为一种保护,实际上被认为是一种很好的风格,可以简化方法的控制流。再说一次:因为这些都是在方法的开头出现的,所以很明显必须有一个条件,否则从方法的开头return就没有意义了。

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

票数 9
EN

Stack Overflow用户

发布于 2009-12-26 08:13:37

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

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

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

票数 8
EN

Stack Overflow用户

发布于 2009-12-26 06:22:47

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
raise ArgumentError, "Invalid direction" unless VALID_DIRECTIONS.include?(direction)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1962724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文