2013-12-09 75 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

相關問題