From: mame@... Date: 2020-02-21T10:57:33+00:00 Subject: [ruby-core:97229] [Ruby master Bug#16643] Array#dig converts keywords to positional hash Issue #16643 has been updated by mame (Yusuke Endoh). jeremyevans0 (Jeremy Evans) wrote in #note-3: > Dan0042 (Daniel DeLorme) wrote in #note-2: > > Are you seriously telling me that you consider it normal and correct that `obj.dig(**kw)` is _not_ equivalent to `[obj].dig(0, **kw)` ??? > > It should be equivalent, if `dig` is defined correctly. I personally think that it should not be equivalent. `obj.dig(a, b, c)` was introduced as a safe-navigation like `obj[a][b][c]`, so I think that `#dig` should accept only positional arguments. In fact, we cannot write `obj.dig(0, key: 1, 2)`. So, it looks good to me to reject all keyword arguments for `.dig`. ---------------------------------------- Bug #16643: Array#dig converts keywords to positional hash https://bugs.ruby-lang.org/issues/16643#change-84339 * Author: Dan0042 (Daniel DeLorme) * Status: Rejected * Priority: Normal * ruby -v: ruby 2.7.0p0 (2019-12-25 revision a65e8644fb) [x86_64-linux] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- The following behavior for `dig` looks very weird to me: ```ruby o=Object.new def o.dig(**kw) p [kw] end o.dig(x:1) #no warning #[{:x=>1}] [o].dig(0, x:1) #warning: Using the last argument as keyword parameters is deprecated #[{:x=>1}] o=Object.new def o.dig(a, **kw) p [a,kw] end o.dig(x:1) #warning: Passing the keyword argument as the last hash parameter is deprecated #[{:x=>1}, {}] [o].dig(0, x:1) #no warning #[{:x=>1}, {}] ``` So the keywords are interpreted as a positional hash, resulting in the opposite of the behavior I would expect. This would be easy to fix by changing `rb_obj_dig` to use ``` return rb_check_funcall_with_hook_kw(obj, id_dig, argc, argv, no_dig_method, obj, RB_PASS_CALLED_KEYWORDS); ``` What this just an oversight? I can't think of a rationale for the current behavior. -- https://bugs.ruby-lang.org/ Unsubscribe: