Issue #14909 has been updated by johannes_luedke (Johannes Ldke).


https://bugs.ruby-lang.org/issues/14909#note-2 doesn't resolve the issue for me

> Why your object has to_hash method?

the objects in question are instances of `Dry::Validation::Result` (dry-validation gem) 

> So, I'd like to propose keeping the current behavior as is, because changing the semantics will bring extra complexity. Instead, just wait for Ruby 3.

Could this maybe be highlighted in the docs -- to be careful when passing objects that respond `to_hash` when there are keyword arguments? 

In order to make it work both ways, `my_func(obj1, obj2, error_code: 422)` as well as `my_func(obj1, obj2)` with a default value for `error_code`, I ended up doing this workaround:

~~~ruby
def my_func(*args)
  opts, objects = args.partition { |el| el.is_a? Hash }
  error_code = opts&.first&.fetch(:error_code, nil) || 400
~~~

It would be cool if ruby would support that out of the box though. 

----------------------------------------
Bug #14909: Method call with object that has to_hash method crashes (method with splat and keyword arguments)
https://bugs.ruby-lang.org/issues/14909#change-72947

* Author: johannes_luedke (Johannes Ldke)
* Status: Feedback
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin17]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
In a method with a splat method argument followed by a keyword argument, it leads to an `ArgumentError` when calling the method with an object that reacts to `to_hash`


~~~ruby
def my_func(*objects, error_code: 400)
  objects.inspect
end

class Test
  def to_hash
    # an example hash
    { to_hash_key: "to_hash" }
  end
end

my_func(Test.new)
~~~

Observed result: an exception is raised: `in my_func: unknown keyword: to_hash_key (ArgumentError)` 
Expected result: `[#<Test:0x007fc8c9825318>]` is returned by the `my_func` call

It should behave the same when calling with objects that have a `to_hash` method and objects that don't, shouldn't it?



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>