【发布时间】:2014-08-29 20:11:10
【问题描述】:
我想为这个方法传递一个数组作为参数,尽可能多的值。例如,如果我在add([1,2,3] 中输入[1,2,3],我应该会收到数组的总和值。
def add(a, b)
a + b
end
def subtract(a, b)
a - b
end
由于我是 Ruby 新手,我不知道该怎么做。谁能解释一下。
【问题讨论】:
我想为这个方法传递一个数组作为参数,尽可能多的值。例如,如果我在add([1,2,3] 中输入[1,2,3],我应该会收到数组的总和值。
def add(a, b)
a + b
end
def subtract(a, b)
a - b
end
由于我是 Ruby 新手,我不知道该怎么做。谁能解释一下。
【问题讨论】:
这样做的通常方法是传递可变数量的参数,我从你的问题中假设是Numeric:
def add_em_up(*args)
args.reduce(:+)
end
add_em_up(1,2,3,4) #=> 10
add_em_up(1,2,3.5,4) #=> 10.5
【讨论】:
#reduce 和 +1 表示 Greedy 运算符。真是太贪心了..呵呵.. :-)
我认为 Andrew 的帖子很好,但您更有可能看到这样的 is_a 方法:
def add(val)
if val.is_a?(Array)
do something
else
@result += val
end
end
【讨论】:
看看你的earlier question,我猜你希望能够区分数组参数和数字参数。尝试使用kind_of? 方法并根据结果进行分支。有关其他建议,请参阅 this 问题(使用 responds_to? 方法更惯用)。
def add(val)
if (val.kind_of?(Array))
# add each element
else
@result += val
end
end
要进行添加,您需要使用each 方法对数组的每个元素执行操作。
val.each do |x|
@result += x
end
【讨论】:
kind_of?,直接去if val.respond_to? :each
#instance_of?.. 有很多人可以回复#each.. 或者,您可以使用respond_to?(:to_ary)... #kind_of for kindness 和 #instance_of? 表示 strictness.. :-) 你想成为什么样的人取决于你.. Loll.
each。
each,因此记录默认用法(对于类似数组的集合)并让该方法也占用一个块,调用者应该知道它传递了什么。在我负责的代码库中使用instance_of 进行类似的操作,您将无法通过代码审查;)