aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--lib/ostruct.rb4
-rw-r--r--test/ostruct/test_ostruct.rb13
3 files changed, 21 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index de1e815bd8..8d18179a40 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Nov 3 14:17:18 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/ostruct.rb (OpenStruct#delete_field): also undefine
+ accessor methods. [ruby-core:33010]
+
Wed Nov 3 14:13:46 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* string.c (rb_enc_cr_str_buf_cat): concatenation of valid
diff --git a/lib/ostruct.rb b/lib/ostruct.rb
index aea0c8e124..e50da65181 100644
--- a/lib/ostruct.rb
+++ b/lib/ostruct.rb
@@ -107,7 +107,9 @@ class OpenStruct
# Remove the named field from the object.
#
def delete_field(name)
- @table.delete name.to_sym
+ sym = name.to_sym
+ @table.delete sym
+ singleton_class.__send__(:remove_method, sym, "#{name}=")
end
InspectKey = :__inspect_key__ # :nodoc:
diff --git a/test/ostruct/test_ostruct.rb b/test/ostruct/test_ostruct.rb
index d92092339a..5c83bfd2a2 100644
--- a/test/ostruct/test_ostruct.rb
+++ b/test/ostruct/test_ostruct.rb
@@ -48,4 +48,17 @@ class TC_OpenStruct < Test::Unit::TestCase
o.freeze
assert_raise(TypeError, '[ruby-core:22559]') {o.a = 1764}
end
+
+ def test_delete_field
+ bug = '[ruby-core:33010]'
+ o = OpenStruct.new
+ assert_not_respond_to(o, :a)
+ assert_not_respond_to(o, :a=)
+ o.a = 'a'
+ assert_respond_to(o, :a)
+ assert_respond_to(o, :a=)
+ o.delete_field :a
+ assert_not_respond_to(o, :a, bug)
+ assert_not_respond_to(o, :a=, bug)
+ end
end