Issue #15225 has been updated by mame (Yusuke Endoh).


Objection.  It is too implicit and ad-hoc to convert a symbol-key hash to an OpenStruct only when assigning it to a field of another OpenStruct.  I believe, in many cases, it can be statically determined that the value being assigned is Hash or not.  It would be readable and easy to maintain to convert it explicitly only when it is a Hash.

I somewhat agree with shevegen: accessing an entry of a symbol-key hash in a method style would be useful, without OpenStruct.  Though, it is very very big change, so I'm unsure if it is acceptable or not.

----------------------------------------
Feature #15225: OpenStruct: Recursively converting child Hash objects to OpenStruct objects.
https://bugs.ruby-lang.org/issues/15225#change-74451

* Author: abhionlyone (Abhilash Reddy)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
Currently, OpenStruct allows this:

~~~ ruby
person = OpenStruct.new
person.age = 25
person.name = "Abhilash"
puts person.name # "Abhilash"
~~~

But something like this is not possible:

~~~ ruby
person.more_info = {country: "Japan",  skills: ["Ruby", "C++"]}
puts person.more_info.country # NoMethodError (undefined method `country' for {:country=>"Japan"}:Hash)
~~~

It will be very helpful if we can provide an option to recursively convert child Hash objects to OpenStruct objects. By default it can be set to false. 

I've done a basic implementation of this and created a PR here: https://github.com/ruby/ostruct/pull/5

Please let me know if there are any objections. If this can be accepted, I would like to add test cases for the same.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>