class Antex::Measurable

Implements an easy to use container for storing measures and retrieving them performing unit conversions.

Measures should be a hash with symbolic keys and numeric values with uniform units.

mea = Measurable.new
mea.measures = { km: 1, mi: 0.621 }

Attributes

default_unit[R]

@return [Symbol] the default unit

measures[R]

@return [Hash] the stored measures @note When setting, the default unit will be set to nil.

Public Class Methods

new() click to toggle source
# File lib/antex/measurable.rb, line 14
def initialize
  @default_unit = nil
  @measures = {}
end

Public Instance Methods

default_unit=(unit) click to toggle source
# File lib/antex/measurable.rb, line 22
def default_unit=(unit)
  raise InvalidUnit, "Unit #{unit} is undefined." unless @measures.key? unit
  raise InvalidUnit, "Unit #{unit} is zero." if @measures[unit].zero?
  @default_unit = unit
end
measures=(**measures) click to toggle source
# File lib/antex/measurable.rb, line 32
def measures=(**measures)
  @default_unit = nil
  @measures = measures
end

Private Instance Methods

calculate(metric, unit = @default_unit) click to toggle source
# File lib/antex/measurable.rb, line 39
def calculate(metric, unit = @default_unit)
  raise InvalidUnit, 'Default unit is not set.' if unit.nil?
  raise InvalidUnit, "Unit #{unit} is undefined." unless @measures.key? unit
  raise InvalidUnit, "Unit #{unit} is zero." if @measures[unit].zero?
  @measures[metric].fdiv @measures[unit]
end
method_missing(method_name, *arguments, &block) click to toggle source

Once measures are set they can be accessed and converted.

mea.km(:km) # => 1.0
mea.km(:mi) # => 1.610...
mea.mi(:mi) # => 1.0
mea.mi(:km) # => 0.621

You can set a default unit for quicker access.

mea.default_unit = :mi
mea.km # => 1.610...
mea.mi # => 1.0
Calls superclass method
# File lib/antex/measurable.rb, line 60
def method_missing(method_name, *arguments, &block)
  return super unless @measures.include? method_name
  send :calculate, method_name, *arguments, &block
end
respond_to_missing?(method_name, include_private = false) click to toggle source
Calls superclass method
# File lib/antex/measurable.rb, line 46
def respond_to_missing?(method_name, include_private = false)
  (@measures.include? method_name) || super
end