2016-07-28 52 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 /提炼特定的方法来解释可能的零值,并将其混合到执行这些计算的文件中。

同样,这是我非常特殊的情况,其中语法需要非常类似于某种风格。

非常感谢所有!