From: akr@... Date: 2018-09-17T05:53:29+00:00 Subject: [ruby-core:89038] [Ruby trunk Bug#15078] Hash splat of empty hash should not create a positional argument. Issue #15078 has been updated by akr (Akira Tanaka). mame (Yusuke Endoh) wrote: > ``` > def target(*args) > p args > end > > def forward(*args, **kw, &blk) > target(*args, **kw, &blk) > end > > target(1, 2, 3, {}) #=> [1, 2, 3, {}] > forward(1, 2, 3, {}) #=> [1, 2, 3] on the semantics you proposed ([1, 2, 3, {}] on the current behavior) > ``` > > Akr-san said that it would be impossible to create a "perfect" semantics to satisfy all cases. In Ruby 2.X, he said that `**empty_hash` should be just ignored, and that `foo({}, **{})` should be always equal to `foo({})`, even if `def foo(opt=42, **kw)` receives `opt=42`. (However, matz showed reluctance to this behavior. So, the solution for this ticket is not decided yet.) How about def `m(**kw) end` binds kw to nil if the last Hash argument is not taken as keyword arguments and `m(**{})` add {} and `m(**nil)` don't add anything to arguments. {}/nil distinguish there are keyword arguments or not. This information is what lacks to implement perfect delegation method. In this behavior, following two should be same behavior (in Ruby 2.X), I think. ``` def f(*a, *kw) g(*a, *kw) end def f(*a) g(*a) end ``` ---------------------------------------- Bug #15078: Hash splat of empty hash should not create a positional argument. https://bugs.ruby-lang.org/issues/15078#change-74065 * Author: marcandre (Marc-Andre Lafortune) * Status: Open * Priority: Normal * Assignee: matz (Yukihiro Matsumoto) * Target version: * ruby -v: ruby 2.6.0dev (2018-08-27 trunk 64545) [x86_64-darwin15] * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- Looks like #10856 is not completely fixed, but I can't reopen it ``` def foo(*args); args; end foo(**{}) # => [] foo(**Hash.new) # => [{}], should be [] ``` -- https://bugs.ruby-lang.org/ Unsubscribe: