三元运算符的if else
如果我有以下的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中的两个条件?
这样的事情,你可能想使用一个简单的查找表,以消除一些逻辑:如果非映射b
值被忽略
EQUIVALENT = {
'Y' => 'guest',
'N' => 'test'
}
if (a.present?)
b = EQUIVALENT[b.value] || b
end
的|| b
部分可能没有必要。
我不会坚持三元运算符,但在外部if
提取共同a.present?
测试,然后使用if
modifiers编写代码的其余部分:
if a.present?
b = test if b.value == 'N'
b = guest if b.value == 'Y'
end
对我来说,这似乎更容易阅读本办法。
b = case b.value
when 'N' then test
when 'Y' then guest
end if a.present?
这是迄今为止唯一的DRY答案。
你可以进一步提取'case'到一个方法。 – Gerry
这是正确的轨道,但在这种形式它是超级局促。在'case'上附加一个尾随的'if'在技术上是有效的,但也是非常令人困惑的。 – tadman
* Tisk * * Tisk *违反了ruby风格规则https://github.com/bbatsov/ruby-style-guide#no-multiline-if-modifiers – engineersmnky
您可以使用三元运算符。这并不意味着你应该这样做,虽然:
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"
不要强行使用三元的。如果你不得不跳过使用它们,那么你可能会迫使一个糟糕的用例。你需要2个三元组来复制if-else结构。 – Carcigenicate
@Carcigenicate是正确的,我不会取代,如果else语句与三元... –
三元语句只会取代其他条件,而不是如果elsif。如果你不能保证你的b.value只是'N'或'Y',你就不能使用三元组。 –