如果我有两个变量,例如a
和h
。
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
传递给其块的参数数量吗?
答案 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
支票。
我认为没有任何简洁明了的方法来了解你在街区内迭代的内容。