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:
parent
90cad6e147
commit
931ea7cfbe
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
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue