Double splat arguments in Crystal

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!

Do you have a project for us?Get a free quote