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