diff options
author | marcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-10-28 21:19:50 +0000 |
---|---|---|
committer | marcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-10-28 21:19:50 +0000 |
commit | 3785d2675abf2e4aca07e89596ea6f12b4c474a5 (patch) | |
tree | 9932e8e24868b0bb49ba2e8f7be7bbf1312d519c | |
parent | 22115ec87e5c805711762eac46cc5332bf2afb16 (diff) | |
download | ruby-3785d2675abf2e4aca07e89596ea6f12b4c474a5.tar.gz |
* lib/ostruct.rb: Also accept {Open}Struct as argument to new
[ruby-core:47476] [Feature #7007]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37375 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | lib/ostruct.rb | 8 | ||||
-rw-r--r-- | test/ostruct/test_ostruct.rb | 7 |
3 files changed, 14 insertions, 3 deletions
@@ -122,6 +122,8 @@ with all sufficient information, see the ChangeLog file. * OpenStruct#eql? * OpenStruct#hash * OpenStruct#to_h converts the struct to a hash. + * extended method: + * OpenStruct.new also accepts an OpenStruct / Struct. * pathname * extended method: diff --git a/lib/ostruct.rb b/lib/ostruct.rb index 8fc3de6e72..17b3ab05e2 100644 --- a/lib/ostruct.rb +++ b/lib/ostruct.rb @@ -74,7 +74,8 @@ class OpenStruct # Creates a new OpenStruct object. By default, the resulting OpenStruct # object will have no attributes. # - # The optional +hash+, if given, will generate attributes and values. + # The optional +hash+, if given, will generate attributes and values + # (can be a Hash, an OpenStruct or a Struct). # For example: # # require 'ostruct' @@ -86,8 +87,9 @@ class OpenStruct def initialize(hash=nil) @table = {} if hash - for k,v in hash - @table[k.to_sym] = v + hash.each_pair do |k, v| + k = k.to_sym + @table[k] = v new_ostruct_member(k) end end diff --git a/test/ostruct/test_ostruct.rb b/test/ostruct/test_ostruct.rb index a7cfbe994f..491f950838 100644 --- a/test/ostruct/test_ostruct.rb +++ b/test/ostruct/test_ostruct.rb @@ -2,6 +2,13 @@ require 'test/unit' require 'ostruct' class TC_OpenStruct < Test::Unit::TestCase + def test_initialize + h = {name: "John Smith", age: 70, pension: 300} + assert_equal h, OpenStruct.new(h).to_h + assert_equal h, OpenStruct.new(OpenStruct.new(h)).to_h + assert_equal h, OpenStruct.new(Struct.new(*h.keys).new(*h.values)).to_h + end + def test_equality o1 = OpenStruct.new o2 = OpenStruct.new |