2017-06-20 38 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" 
相关问题