2014-01-28 42 views
33

如何在Ruby中使用語句編寫多行復雜條件?如何在Ruby中編寫複雜的多行條件?

if ((aa != nil && self.prop1 == aa.decrypt) 
     || (bb != nil && self.prop2 == bb.decrypt) 
    ) && (self.id.nil? || self.id != id) 
    return true 
    end 

我得到Syntax error; unexpected tOROP

在Java中,我可以寫

if (
    ((aa != null && aa.prop1.equals(aa.decrypt())) 
    || (bb != null && bb.prop2.equals(bb.decrypt())) 
    ) 
    && (this.id != id) 
    ) { 

    return true; 
} 

回答

60

簡短的回答是運營商必須在該行,以告訴紅寶石繼續閱讀下一行作爲語句的部分結束,所以這會工作:

if ((aa != nil && self.prop1 == aa.decrypt) || 
    (bb != nil && self.prop2 == bb.decrypt)) && 
    (self.id.nil? || self.id != id) 
    return true 
end 

話雖這麼說,你也許可以通過基於輸入值拋出異常,並去除一些多餘的檢查,減少邏輯(我在這裏做一些跳躍你的變數將是什麼樣子,但你明白了。)

raise 'aa must support decrypt' unless aa.respond_to? :decrypt 
raise 'bb must support decrypt' unless bb.respond_to? :decrypt 
if prop1 == aa.decrypt || prop2 == bb.decrypt 
    if self.id != id 
    return true 
    end 
end 
+0

啊!我懂了。這工作。它實際上是一個循環,所以不會引發異常。 – Chloe

14

你需要逃避空白與反斜槓字符,它的醜陋,但你需要它,如果你想拆分爲多行條件。不管是那個還是離開前一行的布爾運算符。因此,無論這些都將工作:

if ((aa != nil && self.prop1 == aa.decrypt)\ 
     || (bb != nil && self.prop2 == bb.decrypt)\ 
    ) && (self.id.nil? || self.id != id) 
    return true 
    end 

或:

if ((aa != nil && self.prop1 == aa.decrypt) || 
     (bb != nil && self.prop2 == bb.decrypt)) && 
    (self.id.nil? || self.id != id) 
    return true 
    end 

我個人通常決定把每一個或所有條件,自我文件什麼東西被決定的方法:

def everythings_cool? 
    ((aa != nil && self.prop1 == aa.decrypt) || 
      (bb != nil && self.prop2 == bb.decrypt)) && 
     (self.id.nil? || self.id != id) 
end 

那麼:

if everythings_cool? 
    # do stuff 
+0

我喜歡第二種方式。我不喜歡提取方法,除非將它用在多個位置,否則你必須將變量傳遞給它並追蹤它,以便在回顧if語句時找出它正在做什麼。 – Chloe

+2

我也喜歡在自問自答方法中以問號結尾提取即使極少複雜的布爾檢查。提高理智。 – Epigene