2016-07-28 76 views
2

我試圖在ruby中編寫一個總結參數的函數,但是,如果任何參數爲空,它將跳過該參數並繼續(除非所有值都爲零,其中情況下,將返回nil)添加可能沒有值

​​

的問題是參數本身正在以這樣的方式,他們的評估可能會導致零錯誤發送(即輸入是一樣的東西「2-NIL」)。如果發生這種情況,我不希望它中斷,但繼續添加。

換句話說,添加所有參數,如果參數中有零值或無錯誤,請跳過它並繼續添加。

所以我想出了兩個可能的解決方案。

  1. 延遲評估的參數,用引號屏蔽它們並在函數中對它們進行評估,以便我可以捕獲這些錯誤並繼續處理參數。然而,這種屏蔽相當混亂,並且嵌套引號特別混亂。我想知道是否有更簡單的方法來延遲參數的評估?

  2. 本地覆蓋/創建nilclass的加法,減法等方法,使參數中的那些錯誤不會導致錯誤,而是產生nil。但是我不確定如何爲nilclass重寫/創建這些方法,更不用說將其用途限制在整個項目中。

如果任何人有任何對這些選項或任何其他選項的深入瞭解,這將是一個很大的幫助!

編輯:一個例子的輸入可能是

bob = 2 
fred = 3 
tom = nil 
john = nil 

sum(bob, fred+tom, john) => 2 

由於導致零佛瑞德+湯姆原因和錯誤,我想其中。

目前我的解決辦法是

def sum(*vals) 
    sum = nil 
    vals.each do |val| 
     begin 
     value = eval(val) 
     unless value.nil? 
      sum.nil? ? sum = value : sum += value 
     end 
     rescue TypeError, NoMethodError 
     nil 
     end 
    end 
    sum 
end 

sum('bob', 'fred+tom', 'john') => 2 

不過,我想不會有屏蔽每個輸入

+0

你能詳細說明可能的輸入嗎?你說「有點像'2-nil'」,但我不確定你在那裏說什麼。那是「兩減零嗎?「 –

+0

這個問題乞求舉個例子,」null「是什麼意思? –

+0

道歉,所有的例子都被添加了! – Dizzykiwi

回答

0

我得到了你的投入是這樣'2-nil-3.5-nil-1-0-10-nil'字符串獲得一個數組。 如果是這樣,如果輸入數組是沒有那麼大,你可以做很容易像

def sum(*vals) 
    vals.map { |val| eval(val) }.compact.inject(:+) 
end 

顯然,在這種情況下,你可能會壓縮該陣列之前將它傳遞給這一功能,這樣可以儘量避免eval容易。

+0

更改'eval(val)'''eval(val)rescue nil',你很好去。 –

0

對我的具體情況最有效的解決方案是monkeypatching /提煉特定的方法來解釋可能的零值,並將其混合到執行這些計算的文件中。

同樣,這是我非常特殊的情況,其中語法需要非常類似於某種風格。

非常感謝所有!

相關問題