functions/anonymous_parameter_forwarding.rb

tests/_examples/functions/anonymous_parameter_forwarding.rb in the metorex repository.

def target(*args, **options, &given)
  [args, options, given.nil?].inspect
end

def forward_rest(*)
  target(*)
end
puts forward_rest(1, 2)

def forward_keywords(**)
  target(**)
end
puts forward_keywords(a: 1)

def forward_block(&)
  target(&)
end
puts forward_block { :ignored }

def forward_everything(...)
  target(...)
end
puts forward_everything(1, a: 2)

["*", "**", "&"].each do |anonymous|
  begin
    eval("def outer(#{anonymous}); proc { |#{anonymous}| target(#{anonymous}) }; end")
    puts "no error"
  rescue SyntaxError => refused
    puts refused.message.include?("also used within block")
  end
end

Output:

[[1, 2], {}, true]
[[], {a: 1}, true]
[[], {}, false]
[[1], {a: 2}, true]
true
true
true