From: ozydingo@... Date: 2016-03-08T02:26:19+00:00 Subject: [ruby-core:74214] [Ruby trunk Bug#10708] In a function call, double splat of an empty hash still calls the function with an argument Issue #10708 has been updated by Andrew Schwartz. Adding to this, the current behavior results in the following inconsistent behavior: I can call an argless method using a double-splatted empty Hash directly, but this cannot be done via a delegating method. I'm encountering this an an issue with subclasses that override argless parent methods with kwargs, and I would argue that the difference in behavior when calling bar directly vs calling it via foo is very surprising. ~~~ruby def foo(*args, **kwargs) p args p kwargs bar(*args, **kwargs) end def bar puts "yay" end ~~~ ~~~ 2.2.2 > bar # => yay 2.2.2 > bar(*[], **{}) yay 2.2.2 > foo [] {} ArgumentError: wrong number of arguments (1 for 0) from (irb):13:in `bar' from (irb):23:in `foo' from (irb):25 ~~~ ---------------------------------------- Bug #10708: In a function call, double splat of an empty hash still calls the function with an argument https://bugs.ruby-lang.org/issues/10708#change-57350 * Author: Damien Robert * Status: Assigned * Priority: Normal * Assignee: Yukihiro Matsumoto * ruby -v: ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- Consider this: ~~~ruby def foo; end foo(*[]) #Splatting an empty list is ok foo(**{}) #Double splatting an empty hash is like calling foo({}) which gives an error ~~~ This is annoying in a function that is a wrapper around another function and just process some keywords: ~~~ruby def wrapper(*args, keyword: true, **others) puts keyword wrappee(*args,**others) #here this code will fail if others is empty end ~~~ -- https://bugs.ruby-lang.org/ Unsubscribe: