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>
@ -326,8 +326,10 @@ class OpenStruct
|
|||||||
end
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
# Removes the named field from the object. Returns the value that the field
|
# Removes the named field from the object and returns the value the field
|
||||||
# contained if it was defined.
|
# 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"
|
# require "ostruct"
|
||||||
#
|
#
|
||||||
@ -341,6 +343,10 @@ class OpenStruct
|
|||||||
# person.pension = nil
|
# person.pension = nil
|
||||||
# person # => #<OpenStruct name="John", pension=nil>
|
# person # => #<OpenStruct name="John", pension=nil>
|
||||||
#
|
#
|
||||||
|
# person.delete_field('number') # => NameError
|
||||||
|
#
|
||||||
|
# person.delete_field('number') { 8675_309 } # => 8675309
|
||||||
|
#
|
||||||
def delete_field(name)
|
def delete_field(name)
|
||||||
sym = name.to_sym
|
sym = name.to_sym
|
||||||
begin
|
begin
|
||||||
@ -348,6 +354,7 @@ class OpenStruct
|
|||||||
rescue NameError
|
rescue NameError
|
||||||
end
|
end
|
||||||
@table.delete(sym) do
|
@table.delete(sym) do
|
||||||
|
return yield if block_given?
|
||||||
raise! NameError.new("no field `#{sym}' in #{self}", sym)
|
raise! NameError.new("no field `#{sym}' in #{self}", sym)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -89,7 +89,7 @@ class TC_OpenStruct < Test::Unit::TestCase
|
|||||||
a = o.delete_field :a
|
a = o.delete_field :a
|
||||||
assert_not_respond_to(o, :a, bug)
|
assert_not_respond_to(o, :a, bug)
|
||||||
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
|
s = Object.new
|
||||||
def s.to_sym
|
def s.to_sym
|
||||||
:foo
|
:foo
|
||||||
@ -100,6 +100,16 @@ class TC_OpenStruct < Test::Unit::TestCase
|
|||||||
o.delete_field s
|
o.delete_field s
|
||||||
assert_not_respond_to(o, :foo)
|
assert_not_respond_to(o, :foo)
|
||||||
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
|
end
|
||||||
|
|
||||||
def test_setter
|
def test_setter
|
||||||
|
Loading…
x
Reference in New Issue
Block a user