基于if else的三元运算符

时间:2017-06-20 16:12:49

标签: ruby ruby-on-rails-4

如果我有以下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"

但是在这个三元剧中我不是在寻找条件b.value ==' Y'它可能是别的东西' d'或者' e'。

如何更新三元运算符,以便验证if和elsif中的两个条件?

4 个答案:

答案 0 :(得分:4)

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

到目前为止,这是唯一的DRY答案。

答案 1 :(得分:4)

对于这样的事情,你可能想要使用一个简单的查找表来消除一些逻辑:

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

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

如果忽略未映射的|| b值,则可能不需要b部分。

答案 2 :(得分: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"

答案 3 :(得分:-1)

我不会坚持使用三元运算符,而是在外部a.present?中提取常见if测试,然后使用if modifiers编写其余代码:

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

对我而言,这种方式看起来要容易得多。