1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* lib/ostruct.rb (method_missing): Handle [] and []= correctly.

Based on a patch by Caius Durling, bug #4179 [ruby-core:33792]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31753 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
marcandre 2011-05-27 15:59:02 +00:00
parent 40e7d79391
commit a50bdcd6df
3 changed files with 19 additions and 3 deletions

View file

@ -1,3 +1,8 @@
Sat May 28 00:58:40 2011 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
* lib/ostruct.rb (method_missing): Handle [] and []= correctly.
Based on a patch by Caius Durling, bug #4179 [ruby-core:33792]
Fri May 27 23:56:54 2011 Kouhei Sutou <kou@cozmixng.org>
* test/rexml/test_core.rb (Tester::test_text_frozen): split frozen

View file

@ -177,15 +177,15 @@ class OpenStruct
def method_missing(mid, *args) # :nodoc:
mname = mid.id2name
len = args.length
if mname.chomp!('=')
if mname.chomp!('=') && mid != :[]=
if len != 1
raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1)
end
modifiable[new_ostruct_member(mname)] = args[0]
elsif len == 0
elsif len == 0 && mid != :[]
@table[mid]
else
raise NoMethodError, "undefined method `#{mname}' for #{self}", caller(1)
raise NoMethodError, "undefined method `#{mid}' for #{self}", caller(1)
end
end

View file

@ -61,4 +61,15 @@ class TC_OpenStruct < Test::Unit::TestCase
assert_not_respond_to(o, :a, bug)
assert_not_respond_to(o, :a=, bug)
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