The double splat operator gathers keyword options into a hash.

double splat `**options` captures keyword arguments that were not listed separately.

Double Splat

format
double_splat.rb
Replay: real traced execution (multi-file project)
def describe_user(name, **options)
  role = options[:role] || "guest"
  format = options[:format] || "short"
  "#{name}:#{role}:#{format}"
end

format = "short"
description = describe_user("Ada", role: "admin", format: format)

puts "format=#{format}"
puts "description=#{description}"
def describe_user(name, **options)
  role = options[:role] || "guest"
  format = options[:format] || "short"
  "#{name}:#{role}:#{format}"
end

format = "long"
description = describe_user("Ada", role: "admin", format: format)

puts "format=#{format}"
puts "description=#{description}"
def describe_user(name, **options)
  role = options[:role] || "guest"
  format = options[:format] || "short"
  "#{name}:#{role}:#{format}"
end

format = "badge"
description = describe_user("Ada", role: "admin", format: format)

puts "format=#{format}"
puts "description=#{description}"
  1. format ← short

    7format→ short = "short"  #@format="long", "badge"8description = describe_user("Ada", role: "admin", format: formatshort)
  2. role ← admin, format ← short

    1def describe_user(nameAda, **options{:role=>"admin", :format=>"short"})2  role→ admin = options[:role]admin || "guest"3  format→ short = options[:format]short || "short"4  "#{nameAda}:#{roleadmin}:#{formatshort}"5end
  3. description ← Ada:admin:short

    7format = "short"  #@format="long", "badge"8description→ Ada:admin:short = describe_user("Ada", role: "admin", format: formatshort)910puts "format=#{formatshort}"11puts "description=#{descriptionAda:admin:short}"
    outputformat=short
    description=Ada:admin:short
  1. format ← long

    7format→ long = "long"8description = describe_user("Ada", role: "admin", format: formatlong)
  2. role ← admin, format ← long

    1def describe_user(nameAda, **options{:role=>"admin", :format=>"long"})2  role→ admin = options[:role]admin || "guest"3  format→ long = options[:format]long || "short"4  "#{nameAda}:#{roleadmin}:#{formatlong}"5end
  3. description ← Ada:admin:long

    7format = "long"8description→ Ada:admin:long = describe_user("Ada", role: "admin", format: formatlong)910puts "format=#{formatlong}"11puts "description=#{descriptionAda:admin:long}"
    outputformat=long
    description=Ada:admin:long
  1. format ← badge

    7format→ badge = "badge"8description = describe_user("Ada", role: "admin", format: formatbadge)
  2. role ← admin, format ← badge

    1def describe_user(nameAda, **options{:role=>"admin", :format=>"badge"})2  role→ admin = options[:role]admin || "guest"3  format→ badge = options[:format]badge || "short"4  "#{nameAda}:#{roleadmin}:#{formatbadge}"5end
  3. description ← Ada:admin:badge

    7format = "badge"8description→ Ada:admin:badge = describe_user("Ada", role: "admin", format: formatbadge)910puts "format=#{formatbadge}"11puts "description=#{descriptionAda:admin:badge}"
    outputformat=badge
    description=Ada:admin:badge