2013-12-09 41 views
2

Ruby提供了unlesselsif声明。假设会有类似的elsunless陈述似乎是自然的,但是没有。这是否有特定的原因?为什么Ruby中没有`elsunless`语句?

为了说明,这个声明将允许这样的代码。

unless broken 
    # do something 
elsunless done 
    # do something else 
end 

我知道,这个代码可以被改写为使用ifelsif,但在使用unless某些情况下,更清晰。

+7

没有'elseunless'因为它的意思不直观。 –

+1

其实,我会加关键字'otherwise'和'otherwisif'。它比'else'好得多。想一想:“如果真的把”嗨“放在其他地方,否则将”低“末端' – mjnissim

+0

在我看来,'除非..else'很难让你的头,特别是对不熟悉代码的人。我从来没有遇到过使用'if..else'重写它并没有改进的情况。增加另一种选择会使情况更加复杂。 –

回答

5

背后if/else语句的逻辑通常是:

有一个例外:

if exception_a 
    # do exception stuff 
else 
    # do standard stuff 
end 

unless exception_a 
    # do standard stuff 
else 
    # do exception stuff 
end 

在这种情况下添加unless是非常有用的,因为你可以切换你的代码。我还喜欢unless的是,你可以单独做你的标准东西,同时检查异常。 (该else块可以被排除在外)

拥有多个例外:

这里谈到棘手的部分:

if exception_a 
    # do exception stuff a 
elsif exception_b 
    # do exception stuff b 
else 
    # do standard stuff 
end 

unless exception_a 
    # do standard stuff 
elsunless exception_b 
    # do ??? 
else 
    # do exception stuff 
end 

除了是完全不可读的,我无法找到一个合乎逻辑的意义elsunless block:你会在那里输入什么代码?我仍然不知道这是否会是一些例外或标准代码。

也许你可以进一步解释你将在这个块中使用什么代码。

2

Ruby已经提供了if,else,elsifunless,那么真的需要elsunless吗?它看起来像一个庞然大物的庞然大物。我认为Matz没有看到将语句添加到ruby语法的原因。 此外,一些红宝石编码器调查排除unless声明使用,从Perl遗传的ruby编码标准。

至于我,我会完全删除该语言的unless关键字。

看一看在styling guide

+1

尽管我同意'elsunless'会成为屁股疼痛,但我绝不会去除语言中的'除非'。当你掌握它时,它变得非常有用。 –

+1

“if!”要短得多,当然我们总是可以使用DeMorgan的规则。 =) –

+0

“如果不是”更短,而且不是符号。在阅读代码时,符号很容易跳过,尽管我们应该注意,但我们也想说清楚。在语义上,!意味着兴奋,而不是'不'。尽管如此,它在表达方面很有价值。只是我的观点。 – vgoff

相关问题