Class: Measured::Unit

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/measured/unit.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, aliases: [], value: nil, unit_system: nil) ⇒ Unit

Returns a new instance of Unit.



7
8
9
10
11
12
13
14
15
# File 'lib/measured/unit.rb', line 7

def initialize(name, aliases: [], value: nil, unit_system: nil)
  @name = name.to_s.freeze
  @aliases = aliases.map(&:to_s).map(&:freeze).freeze
  @names = ([@name] + @aliases).sort!.freeze
  @conversion_amount, @conversion_unit = parse_value(value) if value
  @inverse_conversion_amount = (1 / conversion_amount if conversion_amount)
  @conversion_string = ("#{conversion_amount} #{conversion_unit}" if conversion_amount || conversion_unit)
  @unit_system = unit_system
end

Instance Attribute Details

#aliasesObject (readonly)

Returns the value of attribute aliases.



5
6
7
# File 'lib/measured/unit.rb', line 5

def aliases
  @aliases
end

#conversion_amountObject (readonly)

Returns the value of attribute conversion_amount.



5
6
7
# File 'lib/measured/unit.rb', line 5

def conversion_amount
  @conversion_amount
end

#conversion_unitObject (readonly)

Returns the value of attribute conversion_unit.



5
6
7
# File 'lib/measured/unit.rb', line 5

def conversion_unit
  @conversion_unit
end

#inverse_conversion_amountObject (readonly)

Returns the value of attribute inverse_conversion_amount.



5
6
7
# File 'lib/measured/unit.rb', line 5

def inverse_conversion_amount
  @inverse_conversion_amount
end

#nameObject (readonly)

Returns the value of attribute name.



5
6
7
# File 'lib/measured/unit.rb', line 5

def name
  @name
end

#namesObject (readonly)

Returns the value of attribute names.



5
6
7
# File 'lib/measured/unit.rb', line 5

def names
  @names
end

#unit_systemObject (readonly)

Returns the value of attribute unit_system.



5
6
7
# File 'lib/measured/unit.rb', line 5

def unit_system
  @unit_system
end

Instance Method Details

#<=>(other) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/measured/unit.rb', line 41

def <=>(other)
  if self.class == other.class
    names_comparison = names <=> other.names
    if names_comparison != 0
      names_comparison
    else
      conversion_amount <=> other.conversion_amount
    end
  else
    name <=> other
  end
end

#inspectObject



34
35
36
37
38
39
# File 'lib/measured/unit.rb', line 34

def inspect
  pieces = [name]
  pieces << "(#{aliases.join(", ")})" if aliases.any?
  pieces << @conversion_string if @conversion_string
  "#<#{self.class.name}: #{pieces.join(" ")}>".freeze
end

#to_sObject



26
27
28
29
30
31
32
# File 'lib/measured/unit.rb', line 26

def to_s
  if @conversion_string
    "#{name} (#{@conversion_string})".freeze
  else
    name
  end
end

#with_unit_system(unit_system) ⇒ Object



17
18
19
20
21
22
23
24
# File 'lib/measured/unit.rb', line 17

def with_unit_system(unit_system)
  self.class.new(
    name,
    aliases: aliases,
    value: @conversion_string,
    unit_system: unit_system
  )
end