Class: OpenStruct

Inherits:
Object
  • Object
show all
Defined in:
lib/sumhash/ostruct.rb

Constant Summary collapse

NUMBER_CLASSES =
[Integer, Fixnum, Bignum, Float, Rational]
SUPPORTED_CLASSES =
NUMBER_CLASSES + [Hash, OpenStruct]

Instance Method Summary collapse

Instance Method Details

#*(num) ⇒ Object

Multiplication

Raises:

  • (TypeError)


50
51
52
53
54
55
56
57
# File 'lib/sumhash/ostruct.rb', line 50

def *(num)
  raise TypeError, "#{num.class} can't be coerced into Float"  unless NUMBER_CLASSES.include? num.class
  self._fields.inject(OpenStruct.new()) do |res, f|
    v = self.send(f)
    res.send(:"#{f}=", SUPPORTED_CLASSES.include?(v.class) && !v.kind_of?(String) ? v*num.to_f : v)
    res
  end
end

#+(os) ⇒ Object

Plus



10
11
12
13
14
15
# File 'lib/sumhash/ostruct.rb', line 10

def +(os)
  (self._fields + os._fields).inject(OpenStruct.new()) do |sum, f|
    sum.send(:"#{f}=", sum(self.send(f), os.send(f)))
    sum
  end
end

#+@Object

Unary plus



35
36
37
# File 'lib/sumhash/ostruct.rb', line 35

def +@
  self
end

#-(os) ⇒ Object

Minus



18
19
20
21
22
23
# File 'lib/sumhash/ostruct.rb', line 18

def -(os)
  (self._fields + os._fields).inject(OpenStruct.new()) do |sum, f|
    sum.send(:"#{f}=", sum(self.send(f), os.send(f), :-))
    sum
  end
end

#-@Object

Unary minus



26
27
28
29
30
31
32
# File 'lib/sumhash/ostruct.rb', line 26

def -@
  self._fields.inject(OpenStruct.new()) do |res, f|
    v = self.send(f)
    res.send(:"#{f}=", SUPPORTED_CLASSES.include?(v.class) ? -v : v)
    res
  end
end

#/(num) ⇒ Object

Division

Raises:

  • (TypeError)


40
41
42
43
44
45
46
47
# File 'lib/sumhash/ostruct.rb', line 40

def /(num)
  raise TypeError, "#{num.class} can't be coerced into Float"  unless NUMBER_CLASSES.include? num.class
  self._fields.inject(OpenStruct.new()) do |res, f|
    v = self.send(f)
    res.send(:"#{f}=", SUPPORTED_CLASSES.include?(v.class) ? v/num.to_f : v)
    res
  end
end

#_fieldsObject



5
6
7
# File 'lib/sumhash/ostruct.rb', line 5

def _fields
  @table.keys.map{|k| k.to_sym }
end