“除非”如何在Ruby中工作?

时间:2012-11-16 14:43:38

标签: ruby

我想重构:

def play_as_dealer
  if value < 16
      hit!(deck)
      play_as_dealer
   end
end

到这个版本

def play_as_dealer
  hit!(deck) unless value > 16
  play_as_dealer
end

我的除非语句的版本不起作用。那是为什么?

3 个答案:

答案 0 :(得分:6)

command unless condition的语义等同于command if !condition。当且仅当条件在逻辑上为假时才会执行该命令,而不是if表达式,如果条件为真,将执行该命令。

你可以使用翻译你的例子,除非这样:

def play_as_dealer
  unless value >= 16
    hit!(deck)
    play_as_dealer
  end
end

在您的示例中,您使用的是表达式的内联版本,其中unless限制仅对该行中的前一个表达式有效。如果您需要限制两个或更多命令,请使用上面示例中的表单。

答案 1 :(得分:2)

我会问你为什么要重构,除非你的if工作正在......

但是,您的除非语法在此实例中不正确 - 它与if-else-end完全相同。

def play_as_dealer
  unless value >= 16
    hit!(deck)
    play_as_dealer
  end
end

答案 2 :(得分:0)

如果你想要块之后的条件,请使用:

def play_as_dealer
  begin
    hit!(deck) 
    play_as_dealer 
  end unless value >= 16
end