是否有更好的方法在Rails中编写密切相关的嵌套if条件?

时间:2017-02-08 18:38:46

标签: ruby-on-rails ruby

以下是一个例子:

if is_important
  if votes < 500
    votes = 3000
  else
    votes = votes * 10
  end
else
  if votes < 500
    votes = 8000
  else
    votes = votes * 5
  end
end

我正在尝试找到在Ruby中以更清晰的方式编写此类嵌套if / else条件的最佳方法。

4 个答案:

答案 0 :(得分:3)

对我来说,“更清洁的方式”是一个简单的界面,这并没有迫使我深入了解实现细节(但是当我不得不这样做时,应该很容易阅读):

def count(votes)
  is_important ? count_important(votes) : count_not_important(votes)
end

private

def count_important(votes)
  votes < 500 ? 3000 : votes * 10
end

def count_not_important(votes)
  votes < 500 ? 8000 : votes * 5
end

P.S。通过这个简单的任务,if/else语句就足够了。

答案 1 :(得分:2)

votes = 
  if is_important
    (votes < 500) ? 3000 : votes * 10
  else
    (votes < 500) ? 8000 : votes * 5
  end

在ruby if-else中,case语句在计算表达式后返回值。

答案 2 :(得分:1)

您可以随时展平您的筑巢。此外,不要忘记检查实际上是否有投票,因为你有一些假设存在的回报。

votes = 0 unless votes
votes = if is_important && votes < 500 
    3000
elsif is_important 
    votes * 10
elsif votes < 500
    8000
else
    votes * 5
end

你也可以使用if和get

votes = 0 unless votes
votes = if is_important && votes < 500 then 3000
elsif is_important then votes * 10
elsif votes < 500 then 8000
else votes * 5
end

答案 3 :(得分:1)

有很多方法可以做到这一点。这是一个干燥和紧凑,但可能太奇怪的一个:

votes = 
  case [is_important, votes < 500]
    when [true, true]   then 3000
    when [true, false]  then votes * 10
    when [false, true]  then 5000
    when [false, false] then votes * 5
    end