2013-11-22 19 views
0

我有幾次發現自己需要在某些ruby腳本中編寫一個相當詳細的if語句。Ruby整數值和整數值的評估

聲明會是這個樣子:

if long_var_name == 0 && very_different_name == 0 && other_third_var == 0 && additional_variable == 0 && name_five == 0 && longest_variable_name_six == 0 
    # (possibly even more conditions) 
    # do stuff here... 
end 

好像必須有一個更優雅的方式來做到這一點。

問題是,ifand是不是很容易與谷歌研究,作爲基本的英文單詞。所以我已經空手而歸了。

有沒有人知道一種方法來縮短這種情況? 當你有更多的時候,它可能成爲一個噩夢。

  • 有時變量重命名不是一個選項。
  • 這些名稱有時大不相同。

注:我發現了類似的情況有一個聰明的解決方案或者:

Ruby Multiple OR Evaluations For String Value

+0

不壞的問題,恕我直言。 Upvote;) –

+0

謝謝。我不想聽起來很討厭,但我看到很多其他人的好問題都被低估了 - 我認爲我們這些試圖回答很多問題的人忘了在我們有時候會上癮。 (我敢肯定我也很內疚)(並且總是有鯊魚) – Plasmarob

回答

6

如果你有一個數組和零專門測試,你可以這樣做:

vars1 = [0,0,3,0,0] 
vars2 = [0,0,0,0,0] 

vars1.all?(&:zero?) # false 
vars2.all?(&:zero?) # true 

編輯:基於OP的添加條件,其值爲不同的名稱:

if [long_var_name_1,long_var_name_2,long_var_name_3].all?(&:zero?) 
    # do stuff here... 
end 
+0

這是正確的答案。 –

+0

這與同類答案本質上不同,但我喜歡將'Proc'傳遞給'all?'!給予好評。 –

+0

非常乾淨,直接點。感謝我和鞋匠。 – Plasmarob

1

在特定情況下,我會寫

if [a, b, c, d, e, f].all? { |var| var == 0 } 

有提錯了鏈接and條件恕我直言。

+0

'和'沒有嚴重問題。我只是不在乎它可以得到多麼混亂。我曾經有過三條線。 – Plasmarob

+1

具有異常多的條件可能是您需要重構代碼的標誌。 –

+0

有時它的代碼我沒有重構的權限,但這是一個很好的觀點。我曾考慮過在某些情況下寫一個包裝,因爲這是我所能想到的 - 在我的結尾使它更清潔。 – Plasmarob

0

您可以使用方法的Enumerable#all?Symbol#to_proc利用率。

foo = 0 
bar = 0 
baz = 0 

[foo, bar, baz].all? &:zero? 
# => true 

one = 1 
two = 2 

[foo, one, two].any? &:zero? 
#=> true 

請注意,您也可以爲測試提供任何匿名函數。

owns_peanuts = ->(person){ person.inventory.contains :peanuts } 
[bill, david, mike].any? &owns_peanuts 
+0

已經回答了.. :) –

+1

可以說,答案沒有提及,但沒有提及哪些方法實際上被調用,因爲它只會顯示爲Ruby魔法。每個人都有自己的想法:-) –

1

你有沒有想過把它分解成邏輯表達式?基本上將其分解成更小的邏輯分組,並且更易於閱讀,例如,

grp_1_zero = var_1 == 0 && var_2 == 0 && var_3 == 0 
grp_2_zero = var_a == 0 && var_b == 0 && var_c == 0 
grp_3_zero = var_z == 0 && var_x == 0 && var_y == 0 

if grp_1_zero && grp_2_zero && grp_3_zero 
    #code here 
end 
+0

這絕對值得考慮。我可能在某個時候需要這個。 – Plasmarob

1

另外,對於陣列a

a == Array.new(a.size,0) 
+0

沒有必要實例化整個其他數組,但是。你應該編輯這篇文章,以包含這個事實,即允許其他可能性。 +給予好評! – Plasmarob

+0

我不主張這一點,只是認爲這值得一提。 '呢?零?'顯然是要走的路。 –