callables/keyword_forwarding.rb

tests/_examples/callables/keyword_forwarding.rb in the metorex repository.

# `ruby2_keywords` keeps the keyword hash a splat gathered marked, so the
# splat can pass it on as keywords again.
class Relay
  ruby2_keywords def gather(*args)
    args
  end

  def keywords(**given)
    given
  end

  def positional(one)
    one
  end
end

relay = Relay.new
gathered = relay.gather 1, name: "ada"
p gathered
marked = gathered.last
p Hash.ruby2_keywords_hash? marked

original = { name: "ada" }
p Hash.ruby2_keywords_hash? original
p relay.keywords(*relay.gather(**original))
p Hash.ruby2_keywords_hash? relay.positional(*relay.gather(**original))

plain = -> *args { args }
p plain.call(2, name: "ada").last.class
marking = -> *args { args }
marking.ruby2_keywords
p Hash.ruby2_keywords_hash? marking.call(2, name: "ada").last

Output:

[1, {name: "ada"}]
true
false
{name: "ada"}
false
Hash
true