In Crystal, as well as in Ruby you can use double splat arguments. Unfortunately they behave a bit different.

def foo(**options) baz(**options, a: 1) end def baz(**options) puts options end foo(b: 2, a: 3) # {:b=>2, :a=>1}

This code in Ruby works as it should. If we try the same in Crystal (https://play.crystal-lang.org/#/r/7r0l), we got an error:

error in line 2 Error: duplicate key: a

This happens because **options is a NamedTuple and it cannot have duplicate keys. I found that using NamedTuple#merge can be a workaround (https://play.crystal-lang.org/#/r/7s1c):

def foo(**options) baz(**options.merge(a: 1)) end def baz(**options) puts options end foo(b: 2, a: 3) # {:b=>2, :a=>1}

Hack!