Issue #15225 has been updated by marcandre (Marc-Andre Lafortune).


First, let's make it clear that it is not acceptable to break backwards compatibility in such an extreme manner. The default can not change.

The caveats of `OpenStruct` have been made more explicit in 3.0 and I am still curious as to the actual usecases that can't be better handled otherwise and that warrant dealing with those caveats.

Note that today, we have tools that seem more appropriate to deal with complex tree-like structures of configuration data, in particular `dig` and pattern matching.

```ruby
person = {name: "Abhilash", more_info: {country: "JAPAN", skills: ["Ruby", "C++"]}}

# using `dig`:
person.dig(:more_info, :skills) # => ["Ruby", "C++"]
{}.dig(:more_info, :skills) # => nil

# more complex example using pattern match:
def is_rubyist?(dev)
  dev in {more_info: {skills: [*, "Ruby", *]}}
end
is_rubyist?(person) # => true
is_rubyist?({}) # => false
```


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

* Author: abhionlyone (Abhilash Reddy)
* Status: Open
* Priority: Normal
----------------------------------------
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>