loading...
JetRockets profile image JetRockets

Double splat arguments in Crystal

twitter logo github logo Updated on ・1 min read

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!

twitter logo DISCUSS (2)
JetRockets is a technology consulting firm that architects, designs, develops and supports enterprise-level web, mobile and software platforms helping clients achieve their goals and grow their businesses.
markdown guide
 

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..

 
Classic DEV Post from Apr 16 '19

Investing in the right technologies to avoid technical debt

How patience can help you avoid jumping on the wrong tech.