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

Add fallback block to OpenStruct#delete_field (#1409)

This commit is contained in:
jfrazx 2021-06-14 08:53:20 -05:00 committed by GitHub
parent 90cad6e147
commit 931ea7cfbe
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
Notes: git 2021-06-14 22:53:41 +09:00
Merged-By: marcandre <github@marc-andre.ca>
2 changed files with 20 additions and 3 deletions

View file

@ -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

View file

@ -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