Class: Alchemist::CompoundMeasurement
- Inherits:
-
Object
- Object
- Alchemist::CompoundMeasurement
show all
- Defined in:
- lib/alchemist/compound_measurement.rb
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
Returns a new instance of CompoundMeasurement.
5
6
7
8
9
|
# File 'lib/alchemist/compound_measurement.rb', line 5
def initialize(numerator)
@coefficient = 1
@numerators = [numerator]
@denominators = []
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *attrs, &block) ⇒ Object
58
59
60
61
62
63
|
# File 'lib/alchemist/compound_measurement.rb', line 58
def method_missing(method, *attrs, &block)
if Alchemist.library.measurement_for(method)
@denominators << Alchemist.measure(1, method)
consolidate
end
end
|
Instance Attribute Details
#denominators ⇒ Object
Returns the value of attribute denominators.
3
4
5
|
# File 'lib/alchemist/compound_measurement.rb', line 3
def denominators
@denominators
end
|
#numerators ⇒ Object
Returns the value of attribute numerators.
3
4
5
|
# File 'lib/alchemist/compound_measurement.rb', line 3
def numerators
@numerators
end
|
Instance Method Details
#*(value) ⇒ Object
11
12
13
14
15
16
17
18
19
20
|
# File 'lib/alchemist/compound_measurement.rb', line 11
def *(value)
case value
when Numeric
@coefficient *= value
self
when Alchemist::Measurement
@numerators << value
return consolidate
end
end
|
#compress_units ⇒ Object
27
28
29
30
31
32
33
|
# File 'lib/alchemist/compound_measurement.rb', line 27
def compress_units
@numerators.each_with_index do |numerator, n|
@denominators.each_with_index do |denominator, d|
remove_excess_units(numerator, n, denominator, d)
end
end
end
|
#consolidate ⇒ Object
22
23
24
25
|
# File 'lib/alchemist/compound_measurement.rb', line 22
def consolidate
compress_units
set_coefficients
end
|
#remove_excess_units(numerator, n, denominator, d) ⇒ Object
35
36
37
38
39
40
41
|
# File 'lib/alchemist/compound_measurement.rb', line 35
def remove_excess_units numerator, n, denominator, d
if should_remove_units? numerator, denominator
@numerators.delete_at(n)
@denominators.delete_at(d)
@coefficient *= (numerator / denominator)
end
end
|
#set_coefficients ⇒ Object
48
49
50
51
52
53
54
55
56
|
# File 'lib/alchemist/compound_measurement.rb', line 48
def set_coefficients
if @denominators.length == 0 && @numerators.length == 1
@numerators[0] * @coefficient
elsif @denominators.length == 0 && @numerators.length == 0
@coefficient
else
self
end
end
|
#should_remove_units?(numerator, denominator) ⇒ Boolean
43
44
45
46
|
# File 'lib/alchemist/compound_measurement.rb', line 43
def should_remove_units? numerator, denominator
return false if numerator.is_a?(Numeric) || denominator.is_a?(Numeric)
(Alchemist.library.measurement_for(numerator.unit_name) & Alchemist.library.measurement_for(denominator.unit_name)).length > 0
end
|