DEV Community

Igor Alexandrov for JetRockets

Posted on • Edited on • Originally published at jetrockets.pro

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} 
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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} 
Enter fullscreen mode Exit fullscreen mode

Hack!

Top comments (2)

Collapse
 
bew profile image
Benoit de Chezelles

Hey, just to tell you that the two shared play links and code blocks are exactly the same, where I think you wanted to show the fixed example code..

Collapse
 
igor_alexandrov profile image
Igor Alexandrov

Fixed. Thank you!