Class: Data::Distance

Inherits:
Units
  • Object
show all
Defined in:
lib/barometer/data/distance.rb

Overview

A simple Distance class

Think of this like the Integer class. Enhancement is that you can create a number (in a certain unit), then get that number back already converted to another unit.

All comparison operations will be done in metric

NOTE: this currently only supports the scale of

kilometers (km) and miles (m).  There is currently
no way to scale to smaller units (eg km -> m -> mm)

Constant Summary collapse

METRIC_UNITS =
"km"
IMPERIAL_UNITS =
"m"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(metric = true) ⇒ Distance

Returns a new instance of Distance.



22
23
24
25
26
# File 'lib/barometer/data/distance.rb', line 22

def initialize(metric=true)
  @kilometers = nil
  @miles = nil
  super(metric)
end

Instance Attribute Details

#kilometersObject

Returns the value of attribute kilometers.



20
21
22
# File 'lib/barometer/data/distance.rb', line 20

def kilometers
  @kilometers
end

#milesObject

Returns the value of attribute miles.



20
21
22
# File 'lib/barometer/data/distance.rb', line 20

def miles
  @miles
end

Class Method Details

.km_to_m(km) ⇒ Object

CONVERTERS



35
36
37
38
# File 'lib/barometer/data/distance.rb', line 35

def self.km_to_m(km)
  return nil unless km && (km.is_a?(Integer) || km.is_a?(Float))
  km.to_f * 0.622
end

.m_to_km(m) ⇒ Object



40
41
42
43
# File 'lib/barometer/data/distance.rb', line 40

def self.m_to_km(m)
  return nil unless m && (m.is_a?(Integer) || m.is_a?(Float))
  m.to_f * 1.609
end

Instance Method Details

#<=>(other) ⇒ Object

OPERATORS



83
84
85
# File 'lib/barometer/data/distance.rb', line 83

def <=>(other)
  self.km <=> other.km
end

#imperial_default=(value) ⇒ Object



29
# File 'lib/barometer/data/distance.rb', line 29

def imperial_default=(value); self.m = value; end

#km(as_integer = true) ⇒ Object

return the stored kilometers or convert from miles



67
68
69
70
# File 'lib/barometer/data/distance.rb', line 67

def km(as_integer=true)
  km = (@kilometers || Data::Distance.m_to_km(@miles))
  km ? (as_integer ? km.to_i : (100*km).round/100.0) : nil
end

#km=(km) ⇒ Object

store kilometers



51
52
53
54
55
# File 'lib/barometer/data/distance.rb', line 51

def km=(km)
  return if !km || !(km.is_a?(Integer) || km.is_a?(Float))
  @kilometers = km.to_f
  self.update_miles(km.to_f)
end

#m(as_integer = true) ⇒ Object

return the stored miles or convert from kilometers



74
75
76
77
# File 'lib/barometer/data/distance.rb', line 74

def m(as_integer=true)
  m = (@miles || Data::Distance.km_to_m(@kilometers))
  m ? (as_integer ? m.to_i : (100*m).round/100.0) : nil
end

#m=(m) ⇒ Object

store miles



59
60
61
62
63
# File 'lib/barometer/data/distance.rb', line 59

def m=(m)
  return if !m || !(m.is_a?(Integer) || m.is_a?(Float))
  @miles = m.to_f
  self.update_kilometers(m.to_f)
end

#metric_default=(value) ⇒ Object



28
# File 'lib/barometer/data/distance.rb', line 28

def metric_default=(value); self.km = value; end

#nil?Boolean

Returns:

  • (Boolean)


136
137
138
# File 'lib/barometer/data/distance.rb', line 136

def nil?
  (@kilometers || @miles) ? false : true
end

#to_f(metric = nil) ⇒ Object

will just return the value (no units) with more precision



99
100
101
# File 'lib/barometer/data/distance.rb', line 99

def to_f(metric=nil)
  (metric || (metric.nil? && self.metric?)) ? self.km(false) : self.m(false)
end

#to_i(metric = nil) ⇒ Object

will just return the value (no units)



93
94
95
# File 'lib/barometer/data/distance.rb', line 93

def to_i(metric=nil)
  (metric || (metric.nil? && self.metric?)) ? self.km : self.m
end

#to_s(metric = nil) ⇒ Object

will return the value with units



105
106
107
# File 'lib/barometer/data/distance.rb', line 105

def to_s(metric=nil)
  (metric || (metric.nil? && self.metric?)) ? "#{self.km} #{METRIC_UNITS}" : "#{self.m} #{IMPERIAL_UNITS}"
end

#units(metric = nil) ⇒ Object

will just return the units (no value)



111
112
113
# File 'lib/barometer/data/distance.rb', line 111

def units(metric=nil)
  (metric || (metric.nil? && self.metric?)) ? METRIC_UNITS : IMPERIAL_UNITS
end

#update_kilometers(m) ⇒ Object

when we set miles, it is possible the a non-equivalent value of kilometers remains. if so, clear it.



117
118
119
120
121
122
123
# File 'lib/barometer/data/distance.rb', line 117

def update_kilometers(m)
  return unless @kilometers
  difference = Data::Distance.m_to_km(m.to_f) - @kilometers
  # only clear kilometers if the stored kilometers is off be more then 1 unit
  # then the conversion of miles
  @kilometers = nil unless difference.abs <= 1.0
end

#update_miles(km) ⇒ Object

when we set kilometers, it is possible the a non-equivalent value of miles remains. if so, clear it.



128
129
130
131
132
133
134
# File 'lib/barometer/data/distance.rb', line 128

def update_miles(km)
  return unless @miles
  difference = Data::Distance.km_to_m(km.to_f) - @miles
  # only clear miles if the stored miles is off be more then 1 unit
  # then the conversion of kilometers
  @miles = nil unless difference.abs <= 1.0
end