It seems that method overloading with the only difference being the type of block passed as a parameter is not possible.
For example, with the following code:
Overloads simply take if it accepts a block or not into account. Would have to also change one of the other criteria to make it correctly be an overload and not a redefinition.
Block arguments are defined by the method that yields, not by how the method is called; the yielding method can’t behave differently depending on the block. You need to find the method before you look at the block, which means block arguments cannot be used to find the method.
It would be technically possible to determine the method based on the number of block arguments, but that’d require removing the ability to skip block arguments (currently yield 1, 2, 3 with a block { |x, y| puts "#{x}, #{y}" } works and prints 1, 2). It’d also be quite confusing, since overloading currently works with both args length and args type, whereas this overloading would only work with length.
So you can use either different names, different regular parameters to create different signatures for both methods.
Another option for this example would be to use regular parameters with different Proc types instead of capturing block parameters. It’s a bit more verbose but semantically completely equivalent: