You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
(Originally posted as a discussion, #1609, I think this is better as an issue)
While working on Kernel#system, I came across a limitation of RBS: it only lets you specify symbol keyword arguments, and not any other type.
Normal keyword arguments in Ruby are passed via key: value, such as gets(chomp: true). However, this syntax is actually sugar for gets(:chomp => true), and Ruby is capable of accepting other values for keys.
defadd_exponentiated_numbers(**kwargs)sum=0kwargs.eachdo |key,value|
sum += key ** valueendendputsadd_exponentiated_numbers2=>3,4=>5,6=>7#=> 280968
There's no real way to typecheck this currently in RBS, as RBS only supports symbols for hash keys. It does have a **rest parameter, but that expects symbols as hash keys as well.
I propose we add two new pieces of syntax to function declarations:
<literal> => <type>, such as def add_one: (0 => Integer).
**<type> => <type>, such as def add_exponentiated_numbers: (**Integer => Integer).
Notably, the ** variant isn't equivalent (nor replaces) the current **<type> <variable> syntax. For example, a simplified Kernel#system (which can take integers for hash keys, which correspond to hash descriptors) could be defined as:
(Originally posted as a discussion, #1609, I think this is better as an issue)
While working on
Kernel#system
, I came across a limitation of RBS: it only lets you specify symbol keyword arguments, and not any other type.Normal keyword arguments in Ruby are passed via
key: value
, such asgets(chomp: true)
. However, this syntax is actually sugar forgets(:chomp => true)
, and Ruby is capable of accepting other values for keys.Take this contrived example:
Or this slightly-less-contrived example:
There's no real way to typecheck this currently in RBS, as RBS only supports symbols for hash keys. It does have a
**rest
parameter, but that expects symbols as hash keys as well.I propose we add two new pieces of syntax to function declarations:
<literal> => <type>
, such asdef add_one: (0 => Integer)
.**<type> => <type>
, such asdef add_exponentiated_numbers: (**Integer => Integer)
.Notably, the
**
variant isn't equivalent (nor replaces) the current**<type> <variable>
syntax. For example, a simplifiedKernel#system
(which can take integers for hash keys, which correspond to hash descriptors) could be defined as:The text was updated successfully, but these errors were encountered: