2017-06-20 39 views
3

如果我有以下的if else語句三元運算符的if else

if a.present? && b.value == 'N' 
b = test 
elsif a.present? && b.value == 'Y' 
b = guest 
end 

我可以寫三元操作這個

b = (a.present? && b.value == 'N') ? "test" : "guest" 

但在這種三元oprator我不是在尋找條件b。值=='Y',它可能是別的'd'或'e'。

如何更新三元運算符,以便驗證if和elsif中的兩個條件?

+4

不要強行使用三元的。如果你不得不跳過使用它們,那麼你可能會迫使一個糟糕的用例。你需要2個三元組來複制if-else結構。 – Carcigenicate

+0

@Carcigenicate是正確的,我不會取代,如果else語句與三元... –

+0

三元語句只會取代其他條件,而不是如果elsif。如果你不能保證你的b.value只是'N'或'Y',你就不能使用三元組。 –

回答

4

這樣的事情,你可能想使用一個簡單的查找表,以消除一些邏輯:如果非映射b值被忽略

EQUIVALENT = { 
    'Y' => 'guest', 
    'N' => 'test' 
} 

if (a.present?) 
    b = EQUIVALENT[b.value] || b 
end 

|| b部分可能沒有必要。

+1

這的確是要走的路。也許我會使用postfix'if',在這個'EQUIVALENT'常量內,它不會顯得擁擠。 – mudasobwa

+0

你太喜歡postfix'if'了。我避免在長於單個關鍵字的任何事物上使用它們,比如'next if ...'或'return unless ...',因爲除此之外更多的參與者往往不太明顯。 – tadman

+0

你總是可以有點冒險,做'b = EQUIVALENT [a.present? && b.value] ||如果你真的想要一個班輪 – tadman

-1

我不會堅持三元運算符,但在外部if提取共同a.present?測試,然後使用if modifiers編寫代碼的其餘部分:

if a.present? 
    b = test if b.value == 'N' 
    b = guest if b.value == 'Y' 
end 

對我來說,這似乎更容易閱讀本辦法。

4
b = case b.value 
    when 'N' then test 
    when 'Y' then guest 
    end if a.present? 

這是迄今爲止唯一的DRY答案。

+0

你可以進一步提取'case'到一個方法。 – Gerry

+0

這是正確的軌道,但在這種形式它是超級侷促。在'case'上附加一個尾隨的'if'在技術上是有效的,但也是非常令人困惑的。 – tadman

+1

* Tisk * * Tisk *違反了ruby風格規則https://github.com/bbatsov/ruby-style-guide#no-multiline-if-modifiers – engineersmnky

1

您可以使用三元運算符。這並不意味着你應該這樣做,雖然:

a.present? && (b.value == 'N' ? b = 'test' : b.value == 'Y' && b = 'guest') 

這裏有一個小測試:

class Object 
    def present? 
    true 
    end 
end 

class NilClass 
    def present? 
    false 
    end 
end 

a = true 

class B 
    attr_accessor :value 
end 

b = B.new 
b.value = 'Y' 

a.present? && (b.value == 'N' ? b = 'test' : b.value == 'Y' && b = 'guest') 

p b 
# "guest" 
相關問題