Matthew Sadler created JRUBY-6404:
-------------------------------------

             Summary: multiple assignment fails to deconstruct object
                 Key: JRUBY-6404
                 URL: https://jira.codehaus.org/browse/JRUBY-6404
             Project: JRuby
          Issue Type: Bug
    Affects Versions: JRuby 1.6.6, JRuby 1.7
            Reporter: Matthew Sadler
            Assignee: Thomas E Enebo
            Priority: Minor
         Attachments: jruby_multiple_assignment_bug.rb

The behaviour of multiple assignment doesn't match MRI.

Firstly, when performing multiple assignment JRuby fails to call #to_ary on the 
object on the right of the assignment if the object implements the handler for 
:to_ary in #method_missing, and is using the #respond_to_missing? callback for 
correct #respond_to? behaviour.

If that's not very clear, hopefully the following code makes more sense:

        class ArrayWrapper
      def initialize(ary)
        @ary = ary
      end
      
      def method_missing(name, *args, &block)
        @ary.send(name, *args, &block)
      end
      
      def respond_to_missing?(name, include_private=false)
        @ary.respond_to?(name, include_private)
      end
    end
    
    wrapper = ArrayWrapper.new([1, 2, 3])
    
    wrapper.respond_to?(:to_ary)
    #=> true, via #respond_to_missing?, ruby 1.9 only
    
    a, b, c = wrapper
    # would expect a #=> 1, b #=> 2, c #=> 3,
    # but instead a is wrapper, b and c are nil

This works however if the correct #method_missing? behaviour is implemented by 
overriding #method_missing?, rather than relying on the #respond_to_missing? 
callback, which is a little strange.


Secondly, MRI actually always calls #to_ary, regardless of what #responds_to? 
says, eg, the following works in MRI:

    class ArrayWrapper
      def initialize(ary)
        @ary = ary
      end
      
      def method_missing(name, *args, &block)
        @ary.send(name, *args, &block)
      end
    end
    
    a, b, c = ArrayWrapper.new([1, 2, 3])
    # a #=> 1, b #=> 2, c #=> 3

Obviously fixing this second issue will resolve the first, but I thought it was 
worth raising the first in case it revealed further issues with #respond_to? 
tests.

I've attached a test case that passes under MRI and fails under JRuby.


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://jira.codehaus.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to