I get the same odd behavior with:

ruby --version ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

./ruby --version ruby 2.4.0preview2 (2016-09-09 trunk 56129) [x86_64-linux]

It looks like the combination ( foo = nil, bar: nil ) causes the issue.


On 10/31/2016 01:01 AM, nobu / ruby-lang.org wrote:
> Issue #12821 has been updated by Nobuyoshi Nakada.
>
> Subject changed from Object converted to Hash unexpectedly uder certain method call to Object converted to Hash unexpectedly under certain method call
> Description updated
>
> ----------------------------------------
> Bug #12821: Object converted to Hash unexpectedly under certain method call
> https://bugs.ruby-lang.org/issues/12821#change-61140
>
> * Author: Hiroyuki Tanaka
> * Status: Open
> * Priority: Normal
> * Assignee:
> * ruby -v: 2.2.5p319, 2.3.1p112, 2.4.0-preview2
> * Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
> ----------------------------------------
> Hi,
>
> I saw a bit strange behavior (at least for me) with the code below; an object given as an argument to a method with a default value and a keyword argument becomes `Hash` class if the object has '`to_hash`' method with ruby >= 2.2, but it is not converted to `Hash` with ruby 2.1.
> I expected the behavior of ruby 2.1.
> Is this a bug or expected behavior of ruby >= 2.2?
>
> I tested both on Linux x86_64 (CentOS 6) and Mac OS X 10.11.6.
>
> ~~~ ruby
> class Test1
> end
>
> class Test2
>    def to_hash
>      {0 => [0, 1]}
>    end
> end
>
> def argtest1 foo, bar: nil
>    p foo.class
> end
>
> def argtest2 foo = nil, bar: nil
>    p foo.class
> end
>
> test1 = Test1.new
> test2 = Test2.new
>
> argtest1(test1) # => Test1
> argtest1(test2) # => Test2
>
> argtest2(test1) # => Test1
> argtest2(test2) # => Hash (2.2.5p319, 2.3.1p112, 2.4.0-preview2), Test2 (2.1.10p492)
> ~~~
>
> Regards,
> Hiroyuki Tanaka
>
>
>


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