我是Ruby的新手,但不是那种允许使用lambda的语言,比如groovy。所以我看到了这个例子:
myArray.product(otherArray).reject{|i,j| i > j}
在ruby代码块中,我之前没有看过这个块有2个参数,但是当我去查看documentation时,我只能看到说它需要1个参数的文档。我查看enumerable
类的相同内容,但该文档也只显示了1个参数。
我知道它有效,我想我希望有一种更简单的方法来确定除了猜测和测试方法之外需要多少个参数。如何判断一个块在Ruby中有多少参数?
答案 0 :(得分:9)
这是有效的,因为Ruby支持解构。
Destructuring允许您将一组变量绑定到通常可以将值绑定到单个变量的任何位置的相应值集。
这允许以下内容成立:
arr = [1, 2]
x = arr
x == [1, 2] # true
y, z = arr
y == 1 # true
z == 2 # true
您可以从以下代码中看到,块的参数中的解构对于采用块的内置方法不是唯一的:
def my_method(arr)
yield arr
end
my_method([1, 2, 3]) {|x| puts x.inspect }
# => [1, 2, 3]
my_method([1, 2, 3]) {|x, y, z| puts x.inspect }
# => 1
查看Destructuring with Ruby了解详情。
答案 1 :(得分:3)
您可以在块参数中进行一些有趣的重组,具体取决于数组的结构:
[[1, 2], [3, 4], [5, 6], [7, 8]].reject {|x,y| y == 8 }
#=> [[1, 2], [3, 4], [5, 6]]
您可以将它们分组在括号中:
[ [[1,2],3], [[1,3],6] ].select {|(x,y),z| x == 1 && z == 3 }
#=> [ [[1,2],3] ]
你也可以使用splat运算符来处理各种事情,比如处理可变长度的子数组:
[[:a,:b,2,3,4,5,6], [:c,:d,7,8,9]].each {|x,y,*numbers| puts numbers.inspect }
#=> [2,3,4,5,6]
#=> [7,8,9]
答案 2 :(得分:1)
Ruby在解释参数方面很灵活;这是一个类似的例子,有一个,然后是两个参数:
[1, 3].product([2, 4]).reject {|a| a.first > a.last }
=> [[1, 2], [1, 4], [3, 4]]
[1, 3].product([2, 4]).reject {|a,b| a > b }
=> [[1, 2], [1, 4], [3, 4]]
这里的经验法则是,您可以将参数视为复合对象,也可以视为集合中的单个元素。如,
[1, 2, 3].tap {|a,b,c| puts [a,b,c].inspect }
[1, 2, 3]
...
[1, 2, 3].tap {|a,b| puts [a,b].inspect }
[1, 2]
...
[1, 2, 3].tap {|a| puts a.inspect }
[1, 2, 3]