From: eregontp@... Date: 2020-08-22T09:56:41+00:00 Subject: [ruby-core:99671] [Ruby master Bug#16853] calling bla(hash, **kw) with a string-based hash passes the strings into **kw (worked < 2.7) Issue #16853 has been updated by Eregon (Benoit Daloze). sylvain.joyeux (Sylvain Joyeux) wrote in #note-9: > Keyword splat would not allow anything but symbols as keys pre-2.7. Indeed, so what happens is the Hash is magically split in two if it has non-Symbol keys (or `raise`s with `**`): ``` Ruby 2.6.6 $ ruby -e 'def m(*args, **kwargs); [args, kwargs]; end; h = { k: 2, "c" => 20 }; p m(h)' [[{"c"=>20}], {:k=>2}] $ ruby -e 'def m(*args, **kwargs); [args, kwargs]; end; h = { k: 2, "c" => 20 }; p m(**h)' Traceback (most recent call last): -e:1:in `
': hash key "c" is not a Symbol (TypeError) ``` > When it comes to optimization, though, I would assume that the keywords are all symbols would open a lot more doors. No, it just added more checks as every call with keyword arguments would need to check all keys are Symbols. ---------------------------------------- Bug #16853: calling bla(hash, **kw) with a string-based hash passes the strings into **kw (worked < 2.7) https://bugs.ruby-lang.org/issues/16853#change-87158 * Author: sylvain.joyeux (Sylvain Joyeux) * Status: Rejected * Priority: Normal * ruby -v: 2.7.1p83 * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- The following code ~~~ def bla(hash = {}, **kw) puts "H: #{hash}" puts "K: #{kw}" end bla "some" => "string" ~~~ **silently** outputs the following (no warnings about deprecation of keyword parameters-from-hash) ~~~ H: {} K: {"some"=>"string"} ~~~ While 2.6.5 (and versions before it) gave ~~~ H: {"some"=>"string"} K: {} ~~~ I would expect "the warning" that started appearing in 2.7, and **definitely** not having strings in a keyword argument hash. -- https://bugs.ruby-lang.org/ Unsubscribe: