Class: OpenStruct
- Defined in:
- lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb
Instance Method Summary collapse
-
#[](key) ⇒ Object
Access a value in the OpenStruct by key, like a Hash.
-
#[]=(key, val) ⇒ Object
Set a value in the OpenStruct by key, like a Hash.
-
#__merge__(other) ⇒ Object
Merge hash data creating a new OpenStruct object.
-
#__update__(other) ⇒ Object
Insert/update hash data on the fly.
- #each(&blk) ⇒ Object
-
#initialize(hash = nil, &block) ⇒ OpenStruct
constructor
Allows the initialization of an OpenStruct with a setter block:.
-
#instance_delegate ⇒ Object
(also: #ostruct_delegate)
Provides access to an OpenStruct’s inner table.
-
#ostruct_merge(other) ⇒ Object
Merge hash data creating a new OpenStruct object.
-
#ostruct_update(other) ⇒ Object
Insert/update hash data on the fly.
- #to_h ⇒ Object
Constructor Details
#initialize(hash = nil, &block) ⇒ OpenStruct
Allows the initialization of an OpenStruct with a setter block:
person = OpenStruct.new do |o|
o.name = 'John Smith'
o.gender = :M
o.age = 71
end
You can still provide a hash for initialization purposes, and even combine the two approaches if you wish.
person = OpenStruct.new(:name => 'John Smith', :age => 31) do |p|
p.gender = :M
end
Alternatively you can provide a default block:
stuff = OpenStruct.new{ |o,k| o[k] = [] }
stuff.place << :a
stuff.place << :b
stuff.place #=> [:a, :b]
A setter block versus a defualt block is determined by the arity of the block. You can not provide both at the same time.
CREDIT Noah Gibbs
CREDIT Gavin Sinclair
CREDIT 7rans
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb', line 60 def initialize(hash=nil, &block) if block && block.arity==2 @table = Hash.new(&block) else @table = {} end if hash for k,v in hash @table[k.to_sym] = v new_ostruct_member(k) end end if block && block.arity==1 yield self end end |
Instance Method Details
#[](key) ⇒ Object
Access a value in the OpenStruct by key, like a Hash. This increases OpenStruct’s “duckiness”.
o = OpenStruct.new
o.t = 4
o['t'] #=> 4
94 95 96 97 |
# File 'lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb', line 94 def [](key) key = key.to_sym unless key.is_a?(Symbol) @table[key] end |
#[]=(key, val) ⇒ Object
Set a value in the OpenStruct by key, like a Hash.
o = OpenStruct.new
o['t'] = 4
o.t #=> 4
105 106 107 108 109 |
# File 'lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb', line 105 def []=(key,val) raise TypeError, "can't modify frozen #{self.class}", caller(1) if self.frozen? key = key.to_sym unless key.is_a?(Symbol) @table[key]=val end |
#__merge__(other) ⇒ Object
Merge hash data creating a new OpenStruct object.
o = OpenStruct.new
o.ostruct_merge { :a => 2 }
o.a #=> 2
184 185 186 187 188 |
# File 'lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb', line 184 def __merge__(other) o = dup o.__update__(other) o end |
#__update__(other) ⇒ Object
Insert/update hash data on the fly.
o = OpenStruct.new
o.ostruct_update { :a => 2 }
o.a #=> 2
170 171 172 173 174 175 176 |
# File 'lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb', line 170 def __update__(other) #other = other.to_hash #to_h? for k,v in other @table[k.to_sym] = v end self end |
#each(&blk) ⇒ Object
78 79 80 |
# File 'lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb', line 78 def each(&blk) @table.each(&blk) end |
#instance_delegate ⇒ Object Also known as: ostruct_delegate
Provides access to an OpenStruct’s inner table.
o = OpenStruct.new
o.a = 1
o.b = 2
o.instance_delegate.each { |k, v| puts "#{k} #{v}" }
produces
a 1
b 2
127 128 129 |
# File 'lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb', line 127 def instance_delegate @table end |
#ostruct_merge(other) ⇒ Object
Merge hash data creating a new OpenStruct object.
o = OpenStruct.new
o.ostruct_merge { :a => 2 }
o.a #=> 2
152 153 154 155 156 |
# File 'lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb', line 152 def ostruct_merge(other) o = dup o.ostruct_update(other) o end |
#ostruct_update(other) ⇒ Object
Insert/update hash data on the fly.
o = OpenStruct.new
o.ostruct_update { :a => 2 }
o.a #=> 2
138 139 140 141 142 143 144 |
# File 'lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb', line 138 def ostruct_update(other) #other = other.to_hash #to_h ? for k,v in other @table[k.to_sym] = v end self end |
#to_h ⇒ Object
83 84 85 |
# File 'lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb', line 83 def to_h @table.dup end |