diff options
author | jfrazx <[email protected]> | 2021-06-14 08:53:20 -0500 |
---|---|---|
committer | GitHub <[email protected]> | 2021-06-14 09:53:20 -0400 |
commit | 931ea7cfbec6d863cd8b48308804323704a2696c (patch) | |
tree | a2585c739c839d5aa86a4488244087d93dd95bb4 | |
parent | 90cad6e14745d812f042df61a6455db022be7389 (diff) |
Add fallback block to `OpenStruct#delete_field` (#1409)
Notes
Notes:
Merged-By: marcandre <[email protected]>
-rw-r--r-- | lib/ostruct.rb | 11 | ||||
-rw-r--r-- | test/ostruct/test_ostruct.rb | 12 |
2 files changed, 20 insertions, 3 deletions
diff --git a/lib/ostruct.rb b/lib/ostruct.rb index 1462901d06..b3ff6efff1 100644 --- a/lib/ostruct.rb +++ b/lib/ostruct.rb @@ -326,8 +326,10 @@ class OpenStruct end # - # Removes the named field from the object. Returns the value that the field - # contained if it was defined. + # Removes the named field from the object and returns the value the field + # contained if it was defined. You may optionally provide a block. + # If the field is not defined, the result of the block is returned, + # or a NameError is raised if no block was given. # # require "ostruct" # @@ -341,6 +343,10 @@ class OpenStruct # person.pension = nil # person # => #<OpenStruct name="John", pension=nil> # + # person.delete_field('number') # => NameError + # + # person.delete_field('number') { 8675_309 } # => 8675309 + # def delete_field(name) sym = name.to_sym begin @@ -348,6 +354,7 @@ class OpenStruct rescue NameError end @table.delete(sym) do + return yield if block_given? raise! NameError.new("no field `#{sym}' in #{self}", sym) end end diff --git a/test/ostruct/test_ostruct.rb b/test/ostruct/test_ostruct.rb index 7773da46af..f8d184b011 100644 --- a/test/ostruct/test_ostruct.rb +++ b/test/ostruct/test_ostruct.rb @@ -89,7 +89,7 @@ class TC_OpenStruct < Test::Unit::TestCase a = o.delete_field :a assert_not_respond_to(o, :a, bug) assert_not_respond_to(o, :a=, bug) - assert_equal(a, 'a') + assert_equal('a', a) s = Object.new def s.to_sym :foo @@ -100,6 +100,16 @@ class TC_OpenStruct < Test::Unit::TestCase o.delete_field s assert_not_respond_to(o, :foo) assert_not_respond_to(o, :foo=) + + assert_raise(NameError) { o.delete_field(s) } + assert_equal(:bar, o.delete_field(s) { :bar }) + + o[s] = :foobar + assert_respond_to(o, :foo) + assert_respond_to(o, :foo=) + assert_equal(:foobar, o.delete_field(s) { :baz }) + + assert_equal(42, OpenStruct.new(foo: 42).delete_field(:foo) { :bug }) end def test_setter |