Class: OpenStruct

Inherits:
Object show all
Defined in:
lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb

Instance Method Summary collapse

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

Raises:

  • (TypeError)


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_delegateObject 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_hObject



83
84
85
# File 'lib/gems/facets-2.4.5/lib/lore/facets/ostruct.rb', line 83

def to_h
  @table.dup
end