2011-06-13 91 views
1

我有一個變量,該變量具有以下值:如何設置2個變量爲1或0根據第三變量看重

blah = # 1, 0, or -1 

現在我要設置這兩個變量:

up 

down 

根據'blah'的值爲1或0。

如果嗒嗒爲1,則高達= 1和向下= 0,如果是嗒嗒-1然後向下= 1和高達= 0

如果嗒嗒爲0,則兩者都爲0。

如何你可以做這個紅寶石的方式沒有太多,如果檢查?

+1

是'有史以來up'任何其他比0? – 2011-06-13 16:37:22

+0

據此,up總是0。當'blah'爲'1'時,爲什麼'up'是0? **編輯** @Jordan先到那裏 – 2011-06-13 16:38:52

+0

當'blah == -1'時'up'是什麼?當'blah == 1'時什麼是'down'? – sawa 2011-06-13 16:45:15

回答

9

溶液1

up, down = 
case blah 
when 1; [1, 0] 
when 0; [0, 0] 
when -1; [0, 1] 
end 

溶液2(由畝啓發太短)

up, down = [[0, 0], [1, 0], [0, 1]][blah] 
+0

@mu太短嗨再次。但是'blah <=> 0'等於'blah'嗎? – sawa 2011-06-13 17:18:00

+1

@mu太短因爲'blah'也總是-1,0或1,所以我認爲@sawa是正確的。 – Kai 2011-06-13 18:14:04

+0

第二個+1。這是我會用的。經過一秒鐘的思考,記住數組是如何工作的,它的隱蔽性就消失了。這將會非常快。 – 2011-06-14 03:58:29

2

根據您的初始規範,下面的代碼工作:

up = 0 
down = -blah 

編輯:

下面是一個使用哈希來達到預期的效果,創造性地:

states = { -1 => [0,1], 0 => [0,0], 1 => [1,0] } 
up, down = states[blah] 
+1

這是爲什麼在軟件開發中需要一個好的規範的證明:) – SirDarius 2011-06-13 16:40:43

1

我不認爲這是紅寶石專用的...像

up = blah != -1 
down = blah != 1 

我假設你的意思是向上應爲1時等等是1

+2

'!='將返回布爾值,他希望整數 – 2011-06-13 16:42:05

+0

好吧,很好;所以'up =(blah == -1?0:1)'; 'down =(blah == 1?0:1)'。雖然我不相信他真的**想要整數......這究竟是什麼目的? – 2011-06-13 16:43:56

+0

老實說,我希望我知道,他可能需要整數,但規範是如此模糊 – 2011-06-13 16:45:34

2
up = blah == 1 ? 1 : 0 
down = blah == -1 ? 1 : 0 
0

將兩個答案重置爲0,然後根據需要進行調整

up, down = 0, 0 
up = 1 if blah > 0 
down = 1 if blah < 0 
3

澤的和SirDarius的,允許blah是大於,小於,或等於零,而不是僅僅-1,0或1的變體:

def mapper(x) 
    h = { 
     -1 => [0, 1], 
     0 => [0, 0], 
     1 => [1, 0] 
    } 
    h[x <=> 0] 
end 

up, down = mapper(blah) 

注意,被指定Fixnum's <=> operator返回-1,0或1(或nil當然):

根據fix是小於,等於還是大於數值返回-1,0,+1或零。

因此使用<=>是實現Fixnum的signum function的安全方法。

+0

我明白了。我明白了你的意思。 – sawa 2011-06-13 17:24:16

0
class Integer 
    def up? 
    self == 1 
    end 

    def down? 
    self == -1 
    end 
end 

x = 1 
x.up? # => true 
1

另一種方式來做到這一點:

up, down = [0, blah].max, [0, -blah].max