2012-04-22 45 views
0

如果這個問題在某個地方得到了回答,但我不積極,我表示歉意我正在爲Google做出正確的措辭,而且我在任何樣式指南中都沒有看到它。首選在Ruby中寫真和假條件的方法

既然Ruby有多種方式來顯示條件中的否定性,那麼編寫條件的首選方法是檢查一個部分是否爲真,而另一部分爲假?例如:

if array && !array.include?('Bob') 
    #do stuff! 

但你也可以說:

if array 
    #do stuff! unless array.include?('Bob') 

或:

if array && not array.include?('Bob') 
    #do stuff 

或:

if !array.nil? && !array.include?('Bob') 

或古怪的雙除非:

unless array.nil? 
    #do stuff unless array.include?('Bob') 

和其他幾個。任何被認爲是最魯比什的想法?來源支持你的意見了嗎?

+1

做力所能及的事是最可讀的在給定的情況下,需要提醒的是「可讀」往往是偏好的問題。 – 2012-04-22 01:30:58

+1

注意[!'和'not'的優先級不一樣](http://phrogz.net/programmingruby/language.html#table_18.4)(比如''&&''''''& '和'/'或'](http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/)),雖然我不相信它會使在你的例子中的差異,這是值得了解的。 – 2012-04-22 01:45:24

回答

1

至於記錄的指引,我能想到的唯一的事情是谷歌的指南,告誡「不要用andor;始終使用&&||代替」。

除此之外,它在某種程度上取決於上下文。如果你擁有的是,如果一個條件爲真,另一個假要執行的代碼,那麼我一定會把他們在一個單一的,如果有&& !

if array && !array.include?('Bob') 
    #do stuff! 

在另一方面,你可能產生額外的代碼,如果第一個條件成立,即使第二個條件成立,也會被執行;在這種情況下,嵌套unlessif是有道理的:

if array 
    do stuff! unless array.include? 'Bob' 
    do other stuff anyway 
end 
+0

我認爲整個「不要使用'和'/'或'永遠」的教條是荒謬的。相反,[知道他們做了什麼](http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/),並在他們有意義時使用它們,就像將要做的那樣與任何其他語言功能。 – 2012-04-22 01:41:55

+0

我傾向於同意,@AndrewMarshall。我只是引用了我能想到的唯一模糊的Ruby風格的文檔,這在我心中是新鮮的,因爲優先問題[最近困惑別人](http://stackoverflow.com/questions/10249164/boolean-logic-在-紅寶石真 - 假真/ 10249213#10249213)。 – 2012-04-22 01:50:52

+0

您對附加代碼@MarkReed做了一個很好的說明,但我特別想到了這一行示例。在你的情況下,我認爲附加代碼的存在有助於塑造更合乎邏輯的流程。 – lyonsinbeta 2012-04-22 02:31:14

0

不提高可讀性,但仍有趣。

如果您使用Rails的,你可以請使用ActiveSupport try擴展這樣的:

if array.try(:include?, 'Bob') 
    # Do stuff 
+0

也是Rails特有的。 Mine是一個本地Ruby腳本,但是我會爲我解決的任何rails項目記下這一點。 – lyonsinbeta 2012-04-22 19:06:53