If you look at the Enumerable#find documentation, you will see that it takes only one parameter per block. The reason you can send it two is because Ruby allows you to do this with blocks based on a "parallel assignment" structure:
[[1,2,3], [4,5,6]].each {|x,y,z| puts "#{x}#{y}#{z}"}
Thus, each of them gives an array element to a block, and since the Ruby block syntax allows you to "expand" the array elements to their components by providing a list of arguments, it works.
You can find more tricks with block arguments here .
a.combination(2) leads to an array of arrays, where each of the subvariant arrays consists of two elements. So:
a = [1,2,3,4] a.combination(2)
As a result, you send one array, for example [1,2] , to find the block, and Ruby performs a parallel assignment to assign from 1 to x and from 2 to y .
Also see this SO question for other powerful examples of parallel assignment such as this statement:
a,(b,(c,d)) = [1,[2,[3,4]]]