2016-07-10 41 views
-4

我知道我可以为两种状态之间切换的可变做这样的事情:设置一个变量的if/else

num = 0 
... 
if num == 0 
    num = 1 
else 
    num = 0 
end 

,但有什么办法,我可以做更多好听,也许是东西像这样:

num = 1 if num == 0 else 0 

我知道那是不对的,但只是类似的东西?

(来自这里的蟒蛇背景)

谢谢!!

+0

欢迎堆栈溢出。由于你的问题没有显示任何研究或努力,你会得到低估。这在堆栈溢出和互联网上多次报道。请阅读“[问]”,包括链接的页面,以及http://meta.stackoverflow.com/q/261592/128421。 –

回答

3

您可以使用三元运算:

num = num == 0 ? 1 : 0 

计算结果为:

conditional ? return_this_if_true : return_this_if_false 
+0

我对这些很熟悉,一定会掉以轻心。谢谢! –

3

您可以使用三元运算符:

num = num == 0 ? 1 : 0 

或者,你可以使用普通旧if/else,它返回评估块的值:

num = if num == 0 
     1 
     else 
     0 
     end 
1

我要补充,如果你真的在谈论0和1之间的切换具体的,而不是任意的两个状态,你可以只使用num ^= 1,这是语法糖num = num^1,其中^是一个二进制xor操作符。

对于真假,你当然可以用val = !val切换。

否则,是的,三元运算符是最简洁的形式。

1
num = 1 - num 

是另一种方式......

1

后首先设置一个数组arr可以使用arr.rotate!.first

arr = [0,1] 
arr.rotate!.first #=> 1 
arr    #=> [1,0] 
arr.rotate!.first #=> 0 
arr    #=> [0,1] 

Alternaively使用cycle

arr = [0,1].cycle 
arr.next #=> 0 
arr.next #=> 1 

也许使用的枚举器(尽管这可能被认为有点结束杀):

def alternator 
    Enumerator.new do |y| 
    arr = [0,1] 
    loop do  
     y << arr.rotate!.first 
    end  
    end 
end 

alt = alternator 
alt.next #=> 1 
alt.next #=> 0