如何将数组作为参数传递给一个方法?
在之前的问题中,我猜测你想要能够区分数组参数和数字参数。尝试使用kind_of?
方法,并根据结果进行分支。参考这个问题获取其他建议(使用respond_to?
方法更符合惯用方式)。
def add(val) if (val.kind_of?(Array)) # add each element else += val end end
要进行加法运算,你需要使用each
方法来对数组的每个元素执行操作。
val.each do |x| += x end
为什么要使用kind_of?
,直接使用if val.respond_to? :each
不就行了吗?
不,我会使用#instance_of?
。有很多可以响应#each
的对象。或者,你也可以使用respond_to?(:to_ary)
... #kind_of
用于kindness,#instance_of?
用于strictness... 🙂 你可以自行决定你想要的是什么。哈哈。
是的,我想要根据字面上的意思回答问题,以防万一visBar以后想要区分其他集合。你不会希望在数组和哈希表上执行相同类型的each
操作。
确实有很多对象可以响应each
,所以记录下默认用法(对于类似数组的集合),并让方法接受一个块,调用者应该知道自己传递了什么。在我负责的代码库中,像这样的情况使用instance_of
,你无法通过代码审查。
在这个帖子中,Andrew提到了如何将数组作为参数传递给一个方法。然而,有一个读者认为Andrew的方法不够常见。相反,他认为更常见的方法是使用is_a
方法来判断参数是否为数组。
以下是使用is_a
方法的示例代码:
def add(val) if val.is_a?(Array) # 当参数为数组时执行某些操作 else # 当参数不是数组时执行某些操作 end end
这段代码首先使用is_a
方法来判断参数val
是否为数组。如果是,将执行# 当参数为数组时执行某些操作
的代码块。如果不是,将执行# 当参数不是数组时执行某些操作
的代码块。
通过使用is_a
方法,我们可以根据参数的类型来执行不同的操作。这样可以增加方法的灵活性和适用性。
在这个问题中,问题的原因是如何将一个数组作为参数传递给一个方法。解决这个问题的方法是使用可变数量的参数来传递数组。
通常的做法是使用可变数量的参数,假设从你的问题中可以得出参数是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
方法和贪婪操作符*
。它真的很贪婪...嗯...
我觉得这有点有趣。发帖后的18个小时里,我收到了10个赞同的答案,但这个答案在某种程度上还算不上是“令人惊叹的”,然而我过去做出的许多杰出贡献却没有获得一个+1。我猜这就是SO的生活。
我同意,这就是SO的生活。