Class: Distance

Inherits:
Object
  • Object
show all
Defined in:
lib/numeric_distance/distance.rb

Constant Summary collapse

CONVERSIONS =
{ :miles       => 1609.344,
:kilometers  => 1000.0,
:meters      => 1.0,
:centimeters => -100.0 }

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(value, unit) ⇒ Distance

Returns a new instance of Distance.



25
26
27
28
29
# File 'lib/numeric_distance/distance.rb', line 25

def initialize(value, unit)
  @value = value
  @unit = unit
  @value_in_meters = Distance.unit_in_meters(value, unit)
end

Instance Attribute Details

#value_in_metersObject (readonly)

Returns the value of attribute value_in_meters.



2
3
4
# File 'lib/numeric_distance/distance.rb', line 2

def value_in_meters
  @value_in_meters
end

Class Method Details

.meters_in_unit(meters, unit) ⇒ Object



9
10
11
12
13
14
15
# File 'lib/numeric_distance/distance.rb', line 9

def self.meters_in_unit(meters, unit)
  if CONVERSIONS[unit] < 0
    meters * CONVERSIONS[unit].abs
  else
    meters / CONVERSIONS[unit]
  end
end

.unit_in_meters(value, unit) ⇒ Object



17
18
19
20
21
22
23
# File 'lib/numeric_distance/distance.rb', line 17

def self.unit_in_meters(value, unit)
  if CONVERSIONS[unit] < 0
    value / CONVERSIONS[unit].abs
  else
    value * CONVERSIONS[unit]
  end
end

Instance Method Details

#+(other) ⇒ Object



52
53
54
55
# File 'lib/numeric_distance/distance.rb', line 52

def +(other)
  new_value_in_meters = @value_in_meters + other.value_in_meters
  ::Distance.new(Distance.meters_in_unit(new_value_in_meters, @unit), @unit)
end

#-(other) ⇒ Object



57
58
59
60
# File 'lib/numeric_distance/distance.rb', line 57

def -(other)
  new_value_in_meters = @value_in_meters - other.value_in_meters
  ::Distance.new(Distance.meters_in_unit(new_value_in_meters, @unit), @unit)
end

#<(other) ⇒ Object



62
63
64
# File 'lib/numeric_distance/distance.rb', line 62

def <(other)
  @value_in_meters < other.value_in_meters
end

#<=(other) ⇒ Object



66
67
68
# File 'lib/numeric_distance/distance.rb', line 66

def <=(other)
  @value_in_meters <= other.value_in_meters
end

#==(other) ⇒ Object



78
79
80
# File 'lib/numeric_distance/distance.rb', line 78

def ==(other)
  @value_in_meters == other.value_in_meters
end

#>(other) ⇒ Object



70
71
72
# File 'lib/numeric_distance/distance.rb', line 70

def >(other)
  @value_in_meters > other.value_in_meters
end

#>=(other) ⇒ Object



74
75
76
# File 'lib/numeric_distance/distance.rb', line 74

def >=(other)
  @value_in_meters >= other.value_in_meters
end

#in_centimetersObject



48
49
50
# File 'lib/numeric_distance/distance.rb', line 48

def in_centimeters
  ::Distance.new(Distance.meters_in_unit(@value_in_meters, :centimeters), :centimeters)
end

#in_kilometersObject



40
41
42
# File 'lib/numeric_distance/distance.rb', line 40

def in_kilometers
  ::Distance.new(Distance.meters_in_unit(@value_in_meters, :kilometers), :kilometers)
end

#in_metersObject



36
37
38
# File 'lib/numeric_distance/distance.rb', line 36

def in_meters
  ::Distance.new(@value_in_meters, :meters)
end

#in_milesObject



44
45
46
# File 'lib/numeric_distance/distance.rb', line 44

def in_miles
  ::Distance.new(Distance.meters_in_unit(@value_in_meters, :miles), :miles)
end

#inspectObject



31
32
33
34
# File 'lib/numeric_distance/distance.rb', line 31

def inspect
  formatted_value = (@value.to_i == @value ? @value.to_i : @value).to_s
  "%s %s" % [formatted_value, (@value == 1 ? @unit.singularize : @unit)]
end

#to_fObject



86
87
88
# File 'lib/numeric_distance/distance.rb', line 86

def to_f
  @value.to_f
end

#to_iObject



82
83
84
# File 'lib/numeric_distance/distance.rb', line 82

def to_i
  @value.to_i
end