procs/keyword_and_group_parameters.rb

tests/_examples/procs/keyword_and_group_parameters.rb in the metorex repository.

# `|**nil|` says a block takes no keyword arguments at all, whether it is a
# lambda or a proc.
refuses_keywords = proc { |**nil| :ok }
puts refuses_keywords.call.inspect
begin
  refuses_keywords.call(a: 1)
rescue ArgumentError => refused
  puts refused.message
end

# A keyword declared without a default has to be given.
needs_a_keyword = proc { |a:, **rest| [a, rest] }
begin
  needs_a_keyword.call
rescue ArgumentError => refused
  puts refused.message
end

# A block whose only positional place is a splat keeps a lone array whole.
gathers = proc { |*taken, **keywords| [taken, keywords] }
puts gathers.call([1, { a: 1 }]).inspect

# A group asks anything but an Array for `to_ary`, and refuses what answers
# something else.
class Pair
  def to_ary
    [1, 2]
  end
end

class NotAPair
  def to_ary
    1
  end
end

spreads = proc { |(first, second)| [first, second] }
puts spreads.call(Pair.new).inspect
begin
  spreads.call(NotAPair.new)
rescue TypeError => refused
  puts refused.class
end

Output:

:ok
no keywords accepted
missing keyword: :a
[[[1, {a: 1}]], {}]
[1, 2]
TypeError