Class: Data::Speed

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

Overview

A simple Speed 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.

Speed is a vector, thus it has a perticular direction, although the direction is independent of the units

All comparison operations will be done in metric

NOTE: this currently only supports the scale of

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

Constant Summary collapse

METRIC_UNITS =
"kph"
IMPERIAL_UNITS =
"mph"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(metric = true) ⇒ Speed

Returns a new instance of Speed.



26
27
28
29
30
31
32
# File 'lib/barometer/data/speed.rb', line 26

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

Instance Attribute Details

#degreesObject

Returns the value of attribute degrees.



24
25
26
# File 'lib/barometer/data/speed.rb', line 24

def degrees
  @degrees
end

#directionObject

Returns the value of attribute direction.



24
25
26
# File 'lib/barometer/data/speed.rb', line 24

def direction
  @direction
end

#kilometersObject

Returns the value of attribute kilometers.



23
24
25
# File 'lib/barometer/data/speed.rb', line 23

def kilometers
  @kilometers
end

#milesObject

Returns the value of attribute miles.



23
24
25
# File 'lib/barometer/data/speed.rb', line 23

def miles
  @miles
end

Class Method Details

.km_to_m(km) ⇒ Object

CONVERTERS



41
42
43
44
# File 'lib/barometer/data/speed.rb', line 41

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



46
47
48
49
# File 'lib/barometer/data/speed.rb', line 46

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



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

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

#imperial_default=(value) ⇒ Object



35
# File 'lib/barometer/data/speed.rb', line 35

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

#kph(as_integer = true) ⇒ Object

return the stored kilometers or convert from miles



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

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

#kph=(kph) ⇒ Object

store kilometers per hour



57
58
59
60
61
# File 'lib/barometer/data/speed.rb', line 57

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

#metric_default=(value) ⇒ Object



34
# File 'lib/barometer/data/speed.rb', line 34

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

#mph(as_integer = true) ⇒ Object

return the stored miles or convert from kilometers



90
91
92
93
# File 'lib/barometer/data/speed.rb', line 90

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

#mph=(mph) ⇒ Object

store miles per hour



65
66
67
68
69
# File 'lib/barometer/data/speed.rb', line 65

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

#nil?Boolean

Returns:

  • (Boolean)


153
154
155
# File 'lib/barometer/data/speed.rb', line 153

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

#to_f(metric = nil) ⇒ Object

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



115
116
117
# File 'lib/barometer/data/speed.rb', line 115

def to_f(metric=nil)
  (metric || (metric.nil? && self.metric?)) ? self.kph(false) : self.mph(false)
end

#to_i(metric = nil) ⇒ Object

will just return the value (no units)



109
110
111
# File 'lib/barometer/data/speed.rb', line 109

def to_i(metric=nil)
  (metric || (metric.nil? && self.metric?)) ? self.kph : self.mph
end

#to_s(metric = nil) ⇒ Object

will return the value with units



121
122
123
# File 'lib/barometer/data/speed.rb', line 121

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

#units(metric = nil) ⇒ Object

will just return the units (no value)



127
128
129
# File 'lib/barometer/data/speed.rb', line 127

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.



134
135
136
137
138
139
140
# File 'lib/barometer/data/speed.rb', line 134

def update_kilometers(m)
  return unless @kilometers
  difference = Data::Speed.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.



145
146
147
148
149
150
151
# File 'lib/barometer/data/speed.rb', line 145

def update_miles(km)
  return unless @miles
  difference = Data::Speed.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