[#97086] [Ruby master Bug#16612] Enumerator::ArithmeticSequence#last with float range produces incorrect value — muraken@...
Issue #16612 has been updated by mrkn (Kenta Murata).
4 messages
2020/02/07
[#97095] [PATCH] Modify shebang of libexec/y2racc and libexec/racc2y. — Wang Mingyu <wangmy@...>
change /usr/local/bin/ruby to /usr/bin/env ruby.
3 messages
2020/02/08
[#97307] [Ruby master Feature#16663] Add block or filtered forms of Kernel#caller to allow early bail-out — headius@...
Issue #16663 has been reported by headius (Charles Nutter).
29 messages
2020/02/28
[ruby-core:97229] [Ruby master Bug#16643] Array#dig converts keywords to positional hash
From:
mame@...
Date:
2020-02-21 10:57:33 UTC
List:
ruby-core #97229
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: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>