mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/ostruct.rb: Finish defining OpenStruct attributes lazily.
Patch by @sferik in [GH-1037]: https://github.com/ruby/ruby/pull/1037 This commit is an addendum to https://github.com/ruby/ruby/pull/1033. It: 1. lazily defines attribute accessors for copied and marshaled objects, 2. returns nil when an attribute reader is not defined, and 3. defines respond_to_missing? to maintain the same respond_to? behavior git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52125 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
5c7f36a1b8
commit
3bf9b2f047
2 changed files with 19 additions and 3 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
Thu Oct 15 01:49:25 2015 Benoit Daloze <eregontp@gmail.com>
|
||||
|
||||
* lib/ostruct.rb: Finish defining OpenStruct attributes lazily.
|
||||
Patch by @sferik in [GH-1037]: https://github.com/ruby/ruby/pull/1037
|
||||
This commit is an addendum to https://github.com/ruby/ruby/pull/1033.
|
||||
It:
|
||||
1. lazily defines attribute accessors for copied and marshaled objects,
|
||||
2. returns nil when an attribute reader is not defined, and
|
||||
3. defines respond_to_missing? to maintain the same respond_to? behavior
|
||||
|
||||
Wed Oct 14 16:56:50 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* configure.in: check for libunwind.h, which is not available in
|
||||
|
|
|
@ -98,7 +98,6 @@ class OpenStruct
|
|||
def initialize_copy(orig)
|
||||
super
|
||||
@table = @table.dup
|
||||
@table.each_key{|key| new_ostruct_member(key)}
|
||||
end
|
||||
|
||||
#
|
||||
|
@ -140,7 +139,6 @@ class OpenStruct
|
|||
#
|
||||
def marshal_load(x)
|
||||
@table = x
|
||||
@table.each_key{|key| new_ostruct_member(key)}
|
||||
end
|
||||
|
||||
#
|
||||
|
@ -172,6 +170,11 @@ class OpenStruct
|
|||
end
|
||||
protected :new_ostruct_member
|
||||
|
||||
def respond_to_missing?(mid, include_private = false)
|
||||
mname = mid.to_s.chomp("=").to_sym
|
||||
@table.key?(mname) || super
|
||||
end
|
||||
|
||||
def method_missing(mid, *args) # :nodoc:
|
||||
len = args.length
|
||||
if mname = mid[/.*(?==\z)/m]
|
||||
|
@ -180,7 +183,10 @@ class OpenStruct
|
|||
end
|
||||
modifiable[new_ostruct_member(mname)] = args[0]
|
||||
elsif len == 0
|
||||
@table[mid]
|
||||
if @table.key?(mid)
|
||||
new_ostruct_member(mid)
|
||||
@table[mid]
|
||||
end
|
||||
else
|
||||
err = NoMethodError.new "undefined method `#{mid}' for #{self}", mid, args
|
||||
err.set_backtrace caller(1)
|
||||
|
|
Loading…
Add table
Reference in a new issue