2012-11-16 23 views
-3

我想重构:“除非”在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 

我与除非报表版本无法正常工作。这是为什么?

+5

你打算会给'值== 16'不同的行为,以及你打算无条件调用'play_as_dealer'? (也就是说,为了缓存直到你用完堆栈?) – willglynn

+4

而且,value <16'的逻辑相反是'value> = 16'。这不是你所拥有的。 – Derek

+0

为什么?当前版本有什么问题,它更易于阅读。 – Yule

回答

5

command unless condition的语义相当于command if !condition。当且仅当条件逻辑错误时才会执行命令,与if表达式相反,如果条件为真,则会执行该命令。

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

在您的例子中,你使用的是表达的内嵌版本,其中unless限制只对在前面的表现效果:

您例如可以使用除非像这样被翻译线。如果您需要限制两个或更多命令,请使用上例中的表单。

2

我会问你为什么要与重构除非如果你的如果是工作...

但是,你除非语法是在这种情况下不正确 - 它是一样一样的一个if else-结束。

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

如果你想块后的条件下,使用此:

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