Class: Eqn::Calculator
- Inherits:
-
Object
- Object
- Eqn::Calculator
- Defined in:
- lib/eqn/calculator.rb
Overview
Primary calculator class used for performing calculations or creating eqn instances.
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(eqn, vars = {}) ⇒ Calculator
constructor
A new instance of Calculator.
-
#method_missing(method, *args) ⇒ Object
rubocop:disable AbcSize.
- #respond_to_missing?(method, _p2 = false) ⇒ Boolean
- #set(key_or_hash, value = nil) ⇒ Object
Constructor Details
#initialize(eqn, vars = {}) ⇒ Calculator
Returns a new instance of Calculator.
4 5 6 7 |
# File 'lib/eqn/calculator.rb', line 4 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
rubocop:disable AbcSize
17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/eqn/calculator.rb', line 17 def method_missing(method, *args) # rubocop:disable AbcSize 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('=').to_sym] = args.first elsif (var = method.to_s.match(/^[A-Za-z]+$/).to_s.to_sym) && @vars.key?(var) @vars[var] else super end end |
Class Method Details
.calculate(data, vars = {}) ⇒ Object Also known as: calc
36 37 38 39 40 |
# File 'lib/eqn/calculator.rb', line 36 def calculate(data, vars = {}) result = Parser.parse(data).value(vars) raise ZeroDivisionError if result.is_a?(Float) && (result.abs == Float::INFINITY || result.nan?) result end |
.valid?(data, vars = {}) ⇒ Boolean
43 44 45 46 47 48 |
# File 'lib/eqn/calculator.rb', line 43 def valid?(data, vars = {}) calc(data, vars) true rescue EqnError false end |
Instance Method Details
#respond_to_missing?(method, _p2 = false) ⇒ Boolean
29 30 31 32 33 |
# File 'lib/eqn/calculator.rb', line 29 def respond_to_missing?(method, _p2 = false) i(calculate calc valid?).include?(method) || method.to_s.match(/^[A-Za-z]+=$/) || (var = method.to_s.match(/^[A-Za-z]+$/).to_s.to_sym) && @vars.key?(var) end |
#set(key_or_hash, value = nil) ⇒ Object
9 10 11 12 13 14 15 |
# File 'lib/eqn/calculator.rb', line 9 def set(key_or_hash, value = nil) if key_or_hash.is_a?(Hash) @vars.merge!(key_or_hash) else @vars[key_or_hash.to_sym] = value end end |