metaprogramming/block_param_defaults_parens.rb
tests/_examples/metaprogramming/block_param_defaults_parens.rb in the metorex repository.
# Block parameter defaults — written with parentheses. `{ |a, b = 1| }`
# binds b to 1 when only one argument is supplied, both in direct block
# calls and in methods created via define_method. A trailing comma in the
# parameter list parses (`|a,|`).
pair = lambda { |a, b = 1| [a, b] }
puts(pair.call(5).inspect)
puts(pair.call(5, 6).inspect)
klass = Class.new do
define_method(:m) { |a, b = 1| return a, b }
end
puts(klass.new.m(1).inspect)
puts(klass.new.m(1, 2).inspect)
begin
klass.new.m
rescue ArgumentError
puts("ArgumentError")
end
begin
klass.new.m(1, 2, 3)
rescue ArgumentError
puts("ArgumentError")
end
first_only = lambda { |a,| a }
puts(first_only.call(9).inspect)
Output:
[5, 1]
[5, 6]
[1, 1]
[1, 2]
ArgumentError
ArgumentError
9