Class: Eqn::Calculator

Inherits:
Object
  • Object
show all
Defined in:
lib/eqn/calculator.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(eqn, vars = {}) ⇒ Calculator

Returns a new instance of Calculator.



3
4
5
6
# File 'lib/eqn/calculator.rb', line 3

def initialize(eqn, vars = {})
  @eqn = eqn
  @vars = vars
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
# File 'lib/eqn/calculator.rb', line 16

def method_missing(method, *args)
  if %i(calculate calc valid?).include?(method)
    self.class.send(method, @eqn, @vars)
  elsif (match = method.to_s.match(/^[A-Za-z]+=$/))
    @vars[match.to_s.delete('=').intern] = args.first
  elsif (var = method.to_s.match(/^[A-Za-z]+$/).to_s.intern) && @vars.key?(var)
    @vars[var]
  else
    super
  end
end

Class Method Details

.calculate(data, vars = {}) ⇒ Object Also known as: calc



29
30
31
32
33
34
35
36
37
38
# File 'lib/eqn/calculator.rb', line 29

def calculate(data, vars = {})
  @@vars = vars
  begin
    result = Parser.parse(data).value
    raise ZeroDivisionError if result.is_a?(Float) && (result.abs == Float::INFINITY || result.nan?)
    result
  ensure
    @@vars = nil
  end
end

.valid?(data, vars = {}) ⇒ Boolean

Returns:

  • (Boolean)


41
42
43
44
45
46
# File 'lib/eqn/calculator.rb', line 41

def valid?(data, vars = {})
  calc(data, vars)
  true
rescue EqnError
  false
end

Instance Method Details

#set(key_or_hash, value = nil) ⇒ Object



8
9
10
11
12
13
14
# File 'lib/eqn/calculator.rb', line 8

def set(key_or_hash, value = nil)
  if key_or_hash.is_a?(Hash)
    @vars.merge!(key_or_hash)
  else
    @vars[key_or_hash.intern] = value
  end
end