1

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

a = [“猫”、“狗”、“垫子”]
h = {cat: 'gatto', dog: 'cane', mat: 'stuoia'} #(意大利语翻译)

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

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

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

4

2 回答 2

4

一个直接的方法是:

a.each{|e| p [*e].length}
# => 1 1 1
h.each{|e| p [*e].length}
# => 2 2 2
于 2012-09-30T19:31:36.893 回答
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支票。

我认为没有任何干净简单的方法可以知道您从块内部迭代的内容。

于 2012-09-30T19:38:40.950 回答