Class: OpenStruct

Inherits:
Object show all
Defined in:
lib/standard/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, Gavin Sinclair



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/standard/facets/ostruct.rb', line 31

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


65
66
67
68
# File 'lib/standard/facets/ostruct.rb', line 65

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)


76
77
78
79
80
# File 'lib/standard/facets/ostruct.rb', line 76

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
x = o.ostruct_merge(:a => 2)
x.a  #=> 2


151
152
153
154
155
# File 'lib/standard/facets/ostruct.rb', line 151

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

Raises:

  • (TypeError)


136
137
138
139
140
141
142
143
# File 'lib/standard/facets/ostruct.rb', line 136

def __update__(other)
  raise TypeError, "can't modify frozen #{self.class}", caller(1) if self.frozen?
  ##other = other.to_hash #to_h?
  for k,v in other
    @table[k.to_sym] = v
  end
  self
end

#each(&blk) ⇒ Object



49
50
51
# File 'lib/standard/facets/ostruct.rb', line 49

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.map { |k, v| "#{k} #{v}" }
#=> ["a 1", "b 2"]


90
91
92
# File 'lib/standard/facets/ostruct.rb', line 90

def instance_delegate
  @table
end

#ostruct_merge(other) ⇒ Object

Merge hash data creating a new OpenStruct object.

o = OpenStruct.new
x = o.ostruct_merge(:a => 2)
x.a  #=> 2


118
119
120
121
122
# File 'lib/standard/facets/ostruct.rb', line 118

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

Raises:

  • (TypeError)


103
104
105
106
107
108
109
110
# File 'lib/standard/facets/ostruct.rb', line 103

def ostruct_update(other)
  raise TypeError, "can't modify frozen #{self.class}", caller(1) if self.frozen?
  ##other = other.to_hash  #to_h ?
  for k,v in other
    @table[k.to_sym] = v
  end
  self
end

#to_hObject



54
55
56
# File 'lib/standard/facets/ostruct.rb', line 54

def to_h
  @table.dup
end

#to_ostructObject



158
159
160
# File 'lib/standard/facets/ostruct.rb', line 158

def to_ostruct
  self
end