如何知道方法传递给块的参数数量?

时间:2012-09-30 19:10:51

标签: ruby ruby-1.9

如果我有两个变量,例如ah

a = ["cat", "dog", "mat"]
h = {cat: 'gatto', dog: 'cane', mat: 'stuoia'}   # (Italian translations)

我在它们上调用方法.each,如果我不知道它们指向的对象类型,我怎么知道传递给a.each的块可以采用一个参数和传递给b.each的块可以使用两个

换句话说,当我将块传递给方法时,如何知道方法将设置多少个块参数?

是否有some_method返回一个块应该采用的参数数量?那么obj.general_method_that_takes_a_block.some_method会返回general_method_that_takes_a_block传递给其块的参数数量吗?

2 个答案:

答案 0 :(得分:4)

一种直截了当的方式是:

a.each{|e| p [*e].length}
# => 1 1 1
h.each{|e| p [*e].length}
# => 2 2 2

答案 1 :(得分:1)

each块总是获得一个参数,它永远不会得到两个。在哈希情况下,当你这样做时:

h.each { |k, v| ... }

Ruby或多或少地在你背后做这件事:

h.each { |a| k, v = a; ... }

因此,您可以检查块的参数是否为数组:

e.each do |x|
    if x.kind_of? Array
        # e might be a Hash
    else
        # e might be an Array
    end
end

问题是,e可能类似于[ [1,2], [3,4] ],它会错误地将您带入可能是哈希分支;这种e也会欺骗[*e].length支票。

我认为没有任何简洁明了的方法来了解你在街区内迭代的内容。