[#33640] [Ruby 1.9-Bug#4136][Open] Enumerable#reject should not inherit the receiver's instance variables — Hiro Asari <redmine@...>

Bug #4136: Enumerable#reject should not inherit the receiver's instance variables

10 messages 2010/12/08

[#33667] [Ruby 1.9-Bug#4149][Open] Documentation submission: syslog standard library — mathew murphy <redmine@...>

Bug #4149: Documentation submission: syslog standard library

11 messages 2010/12/10

[#33683] [feature:trunk] Enumerable#categorize — Tanaka Akira <akr@...>

Hi.

14 messages 2010/12/12
[#33684] Re: [feature:trunk] Enumerable#categorize — "Martin J. Dst" <duerst@...> 2010/12/12

[#33687] Towards a standardized AST for Ruby code — Magnus Holm <judofyr@...>

Hey folks,

23 messages 2010/12/12
[#33688] Re: Towards a standardized AST for Ruby code — Charles Oliver Nutter <headius@...> 2010/12/12

On Sun, Dec 12, 2010 at 9:55 AM, Magnus Holm <judofyr@gmail.com> wrote:

[#33689] Re: Towards a standardized AST for Ruby code — "Haase, Konstantin" <Konstantin.Haase@...> 2010/12/12

On Dec 12, 2010, at 17:46 , Charles Oliver Nutter wrote:

[#33763] [Ruby 1.9-Bug#4168][Open] WeakRef is unsafe to use in Ruby 1.9 — Brian Durand <redmine@...>

Bug #4168: WeakRef is unsafe to use in Ruby 1.9

43 messages 2010/12/17

[#33815] trunk warnflags build issue with curb 0.7.9? — Jon <jon.forums@...>

As this may turn out to be a 3rd party issue rather than a bug, I'd like some feedback.

11 messages 2010/12/22

[#33833] Ruby 1.9.2 is going to be released — "Yuki Sonoda (Yugui)" <yugui@...>

-----BEGIN PGP SIGNED MESSAGE-----

15 messages 2010/12/23

[#33846] [Ruby 1.9-Feature#4197][Open] Improvement of the benchmark library — Benoit Daloze <redmine@...>

Feature #4197: Improvement of the benchmark library

15 messages 2010/12/23

[#33910] [Ruby 1.9-Feature#4211][Open] Converting the Ruby and C API documentation to YARD syntax — Loren Segal <redmine@...>

Feature #4211: Converting the Ruby and C API documentation to YARD syntax

10 messages 2010/12/26

[#33923] [Ruby 1.9-Bug#4214][Open] Fiddle::WINDOWS == false on Windows — Jon Forums <redmine@...>

Bug #4214: Fiddle::WINDOWS == false on Windows

15 messages 2010/12/27

[ruby-core:33792] [Ruby 1.8-Bug#4179][Open] OpenStruct#method_missing handles #[]= wrongly

From: Caius Durling <redmine@...>
Date: 2010-12-20 23:43:25 UTC
List: ruby-core #33792
Bug #4179: OpenStruct#method_missing handles #[]= wrongly
http://redmine.ruby-lang.org/issues/show/4179

Author: Caius Durling
Status: Open, Priority: Normal
Category: lib, Target version: Ruby 1.8.7
ruby -v: ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0] 

## Code to reproduce:

    require "ostruct"
    OpenStruct.new[:foo] = true

## Expected

`NoMethodError` to be raised, as `OpenStruct#[]=` is not a defined method.

## Actual

`wrong number of arguments (2 for 1) (ArgumentError)`

## Notes

I wrote a test case to check that it would raise `NoMethodError` when you call `OpenStruct#[]=`, and then amended `OpenStruct#method_missing` to fix the bug. Patch attached with both test case (including a check that `OpenStruct#[]` raises a `NoMethodError` too) and the fix in it.


----------------------------------------
http://redmine.ruby-lang.org

Attachments (1)

ostruct_square_bracket_equals.patch (977 Bytes, text/x-diff)
diff --git a/lib/ostruct.rb b/lib/ostruct.rb
index 45ebb80..b1ad116 100644
--- a/lib/ostruct.rb
+++ b/lib/ostruct.rb
@@ -89,7 +89,7 @@ class OpenStruct
   def method_missing(mid, *args) # :nodoc:
     mname = mid.id2name
     len = args.length
-    if mname.chomp!('=')
+    if mname.chomp!('=') && mname != "[]"
       if len != 1
         raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1)
       end
diff --git a/test/ostruct/test_ostruct.rb b/test/ostruct/test_ostruct.rb
index 5c140a4..7504e29 100644
--- a/test/ostruct/test_ostruct.rb
+++ b/test/ostruct/test_ostruct.rb
@@ -63,4 +63,15 @@ EOT
     assert_raise(TypeError) {o.a = 'z'}
     assert_equal('a', o.a)
   end
+
+  def test_method_missing_handles_square_bracket_equals
+    o = OpenStruct.new
+    assert_raise(NoMethodError) { o[:foo] = :bar }
+  end
+
+  def test_method_missing_handles_square_brackets
+    o = OpenStruct.new
+    assert_raise(NoMethodError) { o[:foo] }
+  end
+
 end

In This Thread

Prev Next