Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Defining a writer as a Struct member fails #3097

Closed
splattael opened this issue Jul 2, 2015 · 6 comments
Closed

Defining a writer as a Struct member fails #3097

splattael opened this issue Jul 2, 2015 · 6 comments

Comments

@splattael
Copy link
Contributor

Hi,

while this code works in MRI

Struct.new(:x=).new(nil).x = 23

it breaks on JRuby (1.7.20 and 9000k) with:

ArgumentError: wrong number of arguments calling `x=` (1 for 0)
    from (irb):1:in `evaluate'
    from org/jruby/RubyKernel.java:1111:in `eval'
    from org/jruby/RubyKernel.java:1511:in `loop'
    from org/jruby/RubyKernel.java:1274:in `catch'
    from org/jruby/RubyKernel.java:1274:in `catch'
    from /home/ps/.rvm/rubies/jruby-1.7.20/bin/irb:13:in `(root)'

I am not sure if it's a bug in JRuby or MRI.

BTW Rubinius fails too:

ArgumentError: given 1, expected 0
    from (irb):1
    from kernel/common/block_environment.rb:53:in `call_on_instance'
    from kernel/common/eval.rb:176:in `eval'
    from kernel/common/kernel.rb:510:in `loop'
    from kernel/bootstrap/proc.rb:20:in `call'
    from kernel/common/throw_catch.rb:30:in `catch'
    from kernel/common/throw_catch.rb:8:in `register'
    from kernel/common/throw_catch.rb:29:in `catch'
    from kernel/bootstrap/proc.rb:20:in `call'
    from kernel/common/throw_catch.rb:30:in `catch'
    from kernel/common/throw_catch.rb:8:in `register'
    from kernel/common/throw_catch.rb:29:in `catch'
    from /home/ps/.rvm/gems/rbx-2.5.2@global/gems/rubysl-irb-2.1.1/bin/irb:12:in `__script__'
    from kernel/common/kernel.rb:497:in `load'
    from /home/ps/.rvm/gems/rbx-2.5.2@global/bin/irb:23:in `__script__'
    from kernel/delta/code_loader.rb:66:in `load_script'
    from kernel/delta/code_loader.rb:152:in `load_script'
    from kernel/loader.rb:655:in `script'
    from kernel/loader.rb:809:in `main'

¯_(ツ)_/¯

Kind regards,
Peter

@headius
Copy link
Member

headius commented Jul 2, 2015

This is the weirdest use of struct I've ever seen. Congratulations! :-)

@headius
Copy link
Member

headius commented Jul 2, 2015

This appears to have been a change after 1.9.3, so we won't be fixing it in 1.7.20. But 9k gets the fix.

@headius
Copy link
Member

headius commented Jul 2, 2015

So it appears that this creates a write-only value. The logic in MRI for defining the struct methods only defines one called x= and so there's no way to read the value. It does appear to get assigned, though: #<struct :x==1>.

I'm not sure what use this feature is, honestly. It seems like a bug in MRI that it allows this through.

@headius
Copy link
Member

headius commented Jul 2, 2015

I think I'm going to call this a bug in MRI and ask you to re-file it with them. I believe the :x= should be kicked out as an invalid attribute name rather than defined as a write-only attribute. I believe the latter behavior is happening only accidentally because of how MRI detects that you're defining an = method.

Let me know when you file this with MRI and I will chime in about the various oddities in this behavior that warrant patching it.

@headius headius closed this as completed Jul 2, 2015
@headius headius modified the milestones: Won't Fix, JRuby 9.0.0.0.rc2 Jul 2, 2015
@headius headius self-assigned this Jul 2, 2015
@splattael
Copy link
Contributor Author

Heh, will do. Thanks for your help!

@splattael
Copy link
Contributor Author

@headius I've just file an issue for MRI: https://bugs.ruby-lang.org/issues/11326

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants