Class: Data::Speed
- Inherits:
-
Units
- Object
- Units
- Data::Speed
- 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
-
#degrees ⇒ Object
Returns the value of attribute degrees.
-
#direction ⇒ Object
Returns the value of attribute direction.
-
#kilometers ⇒ Object
Returns the value of attribute kilometers.
-
#miles ⇒ Object
Returns the value of attribute miles.
Class Method Summary collapse
-
.km_to_m(km) ⇒ Object
CONVERTERS.
- .m_to_km(m) ⇒ Object
Instance Method Summary collapse
-
#<=>(other) ⇒ Object
OPERATORS.
- #imperial_default=(value) ⇒ Object
-
#initialize(metric = true) ⇒ Speed
constructor
A new instance of Speed.
-
#kph(as_integer = true) ⇒ Object
return the stored kilometers or convert from miles.
-
#kph=(kph) ⇒ Object
store kilometers per hour.
- #metric_default=(value) ⇒ Object
-
#mph(as_integer = true) ⇒ Object
return the stored miles or convert from kilometers.
-
#mph=(mph) ⇒ Object
store miles per hour.
- #nil? ⇒ Boolean
-
#to_f(metric = nil) ⇒ Object
will just return the value (no units) with more precision.
-
#to_i(metric = nil) ⇒ Object
will just return the value (no units).
-
#to_s(metric = nil) ⇒ Object
will return the value with units.
-
#units(metric = nil) ⇒ Object
will just return the units (no value).
-
#update_kilometers(m) ⇒ Object
when we set miles, it is possible the a non-equivalent value of kilometers remains.
-
#update_miles(km) ⇒ Object
when we set kilometers, it is possible the a non-equivalent value of miles remains.
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
#degrees ⇒ Object
Returns the value of attribute degrees.
24 25 26 |
# File 'lib/barometer/data/speed.rb', line 24 def degrees @degrees end |
#direction ⇒ Object
Returns the value of attribute direction.
24 25 26 |
# File 'lib/barometer/data/speed.rb', line 24 def direction @direction end |
#kilometers ⇒ Object
Returns the value of attribute kilometers.
23 24 25 |
# File 'lib/barometer/data/speed.rb', line 23 def kilometers @kilometers end |
#miles ⇒ Object
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
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 |