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

ostruct.rb: Accept block for to_h [#15451].

Patch by Shuji Kobayashi.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66496 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
marcandre 2018-12-22 17:05:03 +00:00
parent 8ef2aae2d0
commit 1e30df6f77
4 changed files with 36 additions and 2 deletions

7
NEWS
View file

@ -239,6 +239,13 @@ sufficient information, see the ChangeLog file or Redmine
* Numeric#step now returns an instance of Enumerator::ArithmeticSequence
class rather than one of Enumerator class.
[OpenStruct]
[Modified methods]
* OpenStruct#to_h now maps keys and values to new keys and values
by the block if given. [Feature #15143]
[Proc]
[New methods]

View file

@ -104,16 +104,29 @@ class OpenStruct
@table = @table.dup
end
#
# call-seq:
# ostruct.to_h -> hash
# ostruct.to_h {|name, value| block } -> hash
#
# Converts the OpenStruct to a hash with keys representing
# each attribute (as symbols) and their corresponding values.
#
# If a block is given, the results of the block on each pair of
# the receiver will be used as pairs.
#
# require "ostruct"
# data = OpenStruct.new("country" => "Australia", :capital => "Canberra")
# data.to_h # => {:country => "Australia", :capital => "Canberra" }
# data.to_h {|name, value| [name.to_s, value.upcase] }
# # => {"country" => "AUSTRALIA", "capital" => "CANBERRA" }
#
def to_h
@table.dup
def to_h(&block)
if block_given?
@table.to_h(&block)
else
@table.dup
end
end
#

View file

@ -26,4 +26,11 @@ describe "OpenStruct#to_h" do
@to_h[:age] = 71
@os.age.should == 70
end
ruby_version_is "2.6" do
it "converts [key, value] pairs returned by the block to a hash" do
h = @os.to_h {|key, value| [key.to_s, value * 2]}
h.should == {"name" => "John SmithJohn Smith", "age" => 140, "pension" => 600}
end
end
end

View file

@ -141,6 +141,13 @@ class TC_OpenStruct < Test::Unit::TestCase
assert_equal(h, OpenStruct.new("name" => "John Smith", "age" => 70, pension: 300).to_h)
end
def test_to_h_with_block
os = OpenStruct.new("country" => "Australia", :capital => "Canberra")
assert_equal({"country" => "AUSTRALIA", "capital" => "CANBERRA" },
os.to_h {|name, value| [name.to_s, value.upcase]})
assert_equal("Australia", os.country)
end
def test_each_pair
h = {name: "John Smith", age: 70, pension: 300}
os = OpenStruct.new(h)