Class: Phys::Quantity
- Inherits:
-
Object
- Object
- Phys::Quantity
- Includes:
- UnitsNumericMixin
- Defined in:
- lib/phys/units/quantity.rb,
lib/phys/units/mixin.rb
Overview
Phys::Quantity is the primary class of Phys-Units library, intended to be manipulated by users. This class represents Physical Quantities with a Unit of measurement. It contains Value and Unit.
-
Value of the quantity is given as the first parameter of Quantity constructor (alias is
Quantity[]). It must be a class instance having arithmetic methods, but it is not necessary to be a Numeric. This is a duck typing way.Phys::Quantity[2.5,"miles"].value #=> 2.5 Phys::Quantity[NArray.float(5).indgen,"miles"].want("m").value #=> NArray.float(5): [ 0.0, 1609.34, 3218.69, 4828.03, 6437.38 ] -
Unit is an instance of Phys::Unit class. It is created from the second argument of Quantity constructor. See document of Phys::Unit.
Phys::Quantity[2.5,"miles"].unit #=> #<Phys::Unit 1609.344,{"m"=>1},@expr="5280 ft">
Direct Known Subclasses
Constant Summary collapse
- @@verbose_inspect =
false
Instance Attribute Summary collapse
-
#expr ⇒ String
readonly
Unit expression.
-
#unit ⇒ Phys::Unit
readonly
Unit of the quantity.
-
#value ⇒ Object
(also: #val)
readonly
Value of the quantity.
Class Method Summary collapse
-
.[](value, unit = nil) ⇒ Phys::Quantity
Alias to Phys::Quantity.new.
Instance Method Summary collapse
-
#%(other) ⇒ Object
(also: #modulo)
Modulo.
-
#*(other) ⇒ Phys::Quantity
Multiplication.
-
#**(n) ⇒ Phys::Quantity
Exponentiation.
-
#+(other) ⇒ Phys::Quantity
Addition.
-
#+@ ⇒ Phys::Quantity
Unary Plus.
-
#-(other) ⇒ Phys::Quantity
Subtraction.
-
#-@ ⇒ Phys::Quantity
Unary Minus.
-
#/(other) ⇒ Phys::Quantity
Division.
-
#<(other) ⇒ Boolean
Comparison.
-
#<=(other) ⇒ Boolean
Comparison.
-
#<=>(other) ⇒ Integer
Comparison of quantities.
-
#==(other) ⇒ Boolean
Equality.
-
#===(x) ⇒ Boolean
(also: #conformable?, #compatible?, #conversion_allowed?)
Conformability of quantity.
-
#>(other) ⇒ Boolean
Comparison.
-
#>=(other) ⇒ Boolean
Comparison.
-
#abs ⇒ Phys::Quantity
Absolute.
-
#abs2 ⇒ Phys::Quantity
Square.
-
#ceil ⇒ Phys::Quantity
Ceil.
-
#close_to(other, epsilon = Float::EPSILON) ⇒ Boolean
Closeness.
- #coerce(other) ⇒ Array
-
#div(other) ⇒ Object
Division without Modulo.
-
#divmod(other) ⇒ Array
Division with Modulo.
-
#floor ⇒ Phys::Quantity
Floor.
-
#initialize(value, expr = nil, unit = nil) ⇒ Quantity
constructor
Initialize a new quantity.
-
#inspect ⇒ String
Inspect String.
-
#quo(other) ⇒ Phys::Quantity
(also: #fdiv)
Division more correctly.
-
#remainder(other) ⇒ Object
Remainder.
-
#round(ndigits = nil) ⇒ Phys::Quantity
Round.
-
#to_base_unit ⇒ Phys::Quantity
(also: #to_si, #to_SI)
Conversion to base unit.
-
#to_f ⇒ Float
(also: #to_float)
Conversion to Float.
-
#to_i ⇒ Integer
(also: #to_int, #to_integer)
Conversion to Integer.
-
#to_numeric ⇒ Numeric
(also: #to_num)
Conversion to Numeric.
-
#to_r ⇒ Rational
(also: #to_rational)
Conversion to Rational.
-
#to_s ⇒ String
Conversion to String.
-
#truncate ⇒ Phys::Quantity
Truncate.
-
#want(unit = nil) ⇒ Phys::Quantity
(also: #convert, #>>)
Conversion to a quantity in another unit.
Methods included from UnitsNumericMixin
#call, #method_missing, #method_missing_units_alias
Constructor Details
#initialize(value, expr, unit = nil) ⇒ Quantity #initialize(value, unit) ⇒ Quantity #initialize(value) ⇒ Quantity
Initialize a new quantity.
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/phys/units/quantity.rb', line 81 def initialize(value,expr=nil,unit=nil) @value = value case expr when String, Symbol @expr = expr.to_s.strip @expr = nil if @expr=='' @unit = unit when NilClass @expr = nil @unit = unit when Unit raise ArgumentError,"Wrong # of argument" if unit @expr = nil @unit = expr else raise ArgumentError,"Second argument is invalid: #{expr.inspect}" end case @unit when NilClass @unit = Unit.parse(@expr||1) when Unit else raise ArgumentError, "Third argument is invalid: #{@unit.inspect}" end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class Phys::UnitsNumericMixin
Instance Attribute Details
#expr ⇒ String (readonly)
Unit expression. Given as the second parameter of the Quantity constructor.
115 116 117 |
# File 'lib/phys/units/quantity.rb', line 115 def expr @expr end |
#unit ⇒ Phys::Unit (readonly)
Unit of the quantity. Instance of Phys::Unit class.
119 120 121 |
# File 'lib/phys/units/quantity.rb', line 119 def unit @unit end |
#value ⇒ Object (readonly) Also known as: val
Value of the quantity. Instance of classes with same arithmetic methods as Numeric.
110 111 112 |
# File 'lib/phys/units/quantity.rb', line 110 def value @value end |
Class Method Details
.[](value, unit = nil) ⇒ Phys::Quantity
Alias to Phys::Quantity.new.
63 64 65 |
# File 'lib/phys/units/quantity.rb', line 63 def [](value,unit=nil) self.new(value,unit) end |
Instance Method Details
#%(other) ⇒ Object Also known as: modulo
Modulo.
-
If the
otherparam is Phys::Quantity,otheris converted to the unit ofself, and returnsmoduloof values. -
If the
otherparam is not Phys::Quantity,otheris regarded as dimensionless, and returnsmoduloof Phys::Quantity.
453 454 455 456 457 458 459 |
# File 'lib/phys/units/quantity.rb', line 453 def %(other) if Quantity===other @value % @unit.convert(other) else self.class.new( @value % other, @expr, @unit ) end end |
#*(other) ⇒ Phys::Quantity
Multiplication. If the other param is not Phys::Quantity, other is regarded as a dimensionless value. The values and units are multiplied respectively.
354 355 356 357 358 359 360 361 362 |
# File 'lib/phys/units/quantity.rb', line 354 def *(other) if Quantity===other a = [self.enclose_expr, other.enclose_expr] a.delete(nil) self.class.new( @value*other.value, a.join(' '), @unit*other.unit ) else self.class.new( @value*other, @expr, @unit ) end end |
#**(n) ⇒ Phys::Quantity
Exponentiation.
311 312 313 314 315 316 317 318 319 320 |
# File 'lib/phys/units/quantity.rb', line 311 def **(n) if @expr.nil? expr = nil elsif /^[A-Za-z_]+$/o =~ @expr expr = @expr+'^'+n.to_s else expr = '('+@expr+')^'+n.to_s+'' end self.class.new( @value**n, expr, @unit**n ) end |
#+(other) ⇒ Phys::Quantity
Addition. Before the operation, it converts other to the unit of self.
-
If the
otherparam is Phys::Quantity,otheris converted to the unit ofself. -
If the
otherparam is not Phys::Quantity, both params must be dimensionless.
159 160 161 162 |
# File 'lib/phys/units/quantity.rb', line 159 def +(other) val = @value + @unit.convert_scale(other) self.class.new( val, @expr, @unit ) end |
#+@ ⇒ Phys::Quantity
Unary Plus. Returns self.
223 224 225 |
# File 'lib/phys/units/quantity.rb', line 223 def +@ self.class.new( @value, @expr, @unit ) end |
#-(other) ⇒ Phys::Quantity
Subtraction. Before the operation, it converts other to the unit of self.
-
If the
otherparam is Phys::Quantity,otheris converted to the unit ofself. -
If the
otherparam is not Phys::Quantity, both params must be dimensionless.
174 175 176 177 |
# File 'lib/phys/units/quantity.rb', line 174 def -(other) val = @value - @unit.convert_scale(other) self.class.new( val, @expr, @unit ) end |
#-@ ⇒ Phys::Quantity
Unary Minus. Returns a quantity with negative value in the same unit of self.
230 231 232 |
# File 'lib/phys/units/quantity.rb', line 230 def -@ self.class.new( -@value, @expr, @unit ) end |
#/(other) ⇒ Phys::Quantity
Division. If the other param is not Phys::Quantity, other is regarded as a dimensionless value. The values and units are divided respectively. Note that the method of the value’s class is used.
375 376 377 378 379 380 381 382 383 |
# File 'lib/phys/units/quantity.rb', line 375 def /(other) if Quantity===other a = [self.enclose_expr, other.enclose_expr_div] a.delete(nil) self.class.new( @value/other.value, a.join, @unit/other.unit ) else self.class.new( @value/other, @expr, @unit ) end end |
#<(other) ⇒ Boolean
Comparison. Returns true if self is less than other. Before the comparison, it converts other to the unit of self.
281 282 283 |
# File 'lib/phys/units/quantity.rb', line 281 def < (other) @value < @unit.convert(other) end |
#<=(other) ⇒ Boolean
Comparison. Returns true if self is less-than or equal-to other. Before the comparison, it converts other to the unit of self.
272 273 274 |
# File 'lib/phys/units/quantity.rb', line 272 def <= (other) @value <= @unit.convert(other) end |
#<=>(other) ⇒ Integer
Comparison of quantities. Before the comparison, it converts other to the unit of self.
239 240 241 |
# File 'lib/phys/units/quantity.rb', line 239 def <=> (other) @value <=> @unit.convert(other) end |
#==(other) ⇒ Boolean
Equality. Returns true if self has the same value as other. Before the comparison, it converts other to the unit of self.
247 248 249 250 251 252 253 254 255 256 |
# File 'lib/phys/units/quantity.rb', line 247 def == (other) if Quantity===other @unit.conformable?(other.unit) && @value == @unit.convert(other) elsif @unit.dimensionless? @unit.convert_value_to_base_unit(@value) == other else false end end |
#===(x) ⇒ Boolean Also known as: conformable?, compatible?, conversion_allowed?
Conformability of quantity. Returns true if unit conversion between self and x is possible.
557 558 559 560 561 562 563 564 565 566 567 568 |
# File 'lib/phys/units/quantity.rb', line 557 def ===(x) case x when Unit unit === x when Quantity unit === x.unit when Numeric unit.dimensionless? else false end end |
#>(other) ⇒ Boolean
Comparison. Returns true if self is greater than other. Before the comparison, it converts other to the unit of self.
290 291 292 |
# File 'lib/phys/units/quantity.rb', line 290 def > (other) @value > @unit.convert(other) end |
#>=(other) ⇒ Boolean
Comparison. Returns true if self is greater-than or equal-to other. Before the comparison, it converts other to the unit of self.
263 264 265 |
# File 'lib/phys/units/quantity.rb', line 263 def >= (other) @value >= @unit.convert(other) end |
#abs ⇒ Phys::Quantity
Absolute. Returns a quantity in the same unit of self.
181 182 183 |
# File 'lib/phys/units/quantity.rb', line 181 def abs self.class.new( @value.abs, @expr, @unit ) end |
#abs2 ⇒ Phys::Quantity
Square. Returns a quantity in squared unit of self.
187 188 189 |
# File 'lib/phys/units/quantity.rb', line 187 def abs2 self**2 end |
#ceil ⇒ Phys::Quantity
Ceil. Returns a quantity with the smallest Integer value greater than or equal to self value, in the same unit of self.
194 195 196 |
# File 'lib/phys/units/quantity.rb', line 194 def ceil self.class.new( @value.ceil, @expr, @unit ) end |
#close_to(other, epsilon = Float::EPSILON) ⇒ Boolean
Closeness. Returns true if
(self-other).abs <= (self.abs+other.abs) * epsilon
Before the comparison, it converts other to the unit of self.
301 302 303 304 305 |
# File 'lib/phys/units/quantity.rb', line 301 def close_to(other,epsilon=Float::EPSILON) other_value = @unit.convert(other) abs_sum = @value.abs+other_value.abs (@value-other_value).abs <= abs_sum*epsilon end |
#coerce(other) ⇒ Array
484 485 486 |
# File 'lib/phys/units/quantity.rb', line 484 def coerce(other) [ self.class.new(other), self ] end |
#div(other) ⇒ Object
Division without Modulo.
-
If the
otherparam is Phys::Quantity,otheris converted to the unit ofself, and returnsdivof values. -
If the
otherparam is not Phys::Quantity,otheris regarded as dimensionless, and returnsdivof Phys::Quantity.
415 416 417 418 419 420 421 |
# File 'lib/phys/units/quantity.rb', line 415 def div(other) if Quantity===other @value.div( @unit.convert(other) ) else self.class.new( @value.div(other), @expr, @unit ) end end |
#divmod(other) ⇒ Array
Division with Modulo.
-
If the
otherparam is Phys::Quantity,otheris converted to the unit ofself, and returnsdivmodof values. -
If the
otherparam is not Phys::Quantity,otheris regarded as dimensionless, and returnsdivmodof Phys::Quantity.
473 474 475 476 477 478 479 480 481 |
# File 'lib/phys/units/quantity.rb', line 473 def divmod(other) if Quantity===other @value.divmod( @unit.convert(other) ) else d,m = @value.divmod(other) [ self.class.new( d, @expr, @unit ), self.class.new( m, @expr, @unit ) ] end end |
#floor ⇒ Phys::Quantity
Floor. Returns a quantity with the largest integer value less than or equal to self value, in the same unit of self.
210 211 212 |
# File 'lib/phys/units/quantity.rb', line 210 def floor self.class.new( @value.floor, @expr, @unit ) end |
#inspect ⇒ String
Inspect String.
547 548 549 550 551 552 |
# File 'lib/phys/units/quantity.rb', line 547 def inspect expr = @expr || @unit.expr expr = (expr) ? ","+expr.inspect : "" sufx = (@@verbose_inspect) ? " "+@unit.inspect : "" self.class.to_s+"["+Unit::Utils.num_inspect(@value)+expr+"]"+sufx end |
#quo(other) ⇒ Phys::Quantity Also known as: fdiv
Division more correctly. If the other param is not Phys::Quantity, other is regarded as a dimensionless value. The values and units are divided respectively.
393 394 395 396 397 398 399 400 401 |
# File 'lib/phys/units/quantity.rb', line 393 def quo(other) if Quantity===other a = [self.enclose_expr, other.enclose_expr_div] a.delete(nil) self.class.new( @value.quo(other.value), a.join, @unit/other.unit ) else self.class.new( @value.quo(other), @expr, @unit ) end end |
#remainder(other) ⇒ Object
Remainder.
-
If the
otherparam is Phys::Quantity,otheris converted to the unit ofself, and returnsremainderof values. -
If the
otherparam is not Phys::Quantity,otheris regarded as dimensionless, and returnsremainderof Phys::Quantity.
434 435 436 437 438 439 440 |
# File 'lib/phys/units/quantity.rb', line 434 def remainder(other) #:nodoc: used internally if Quantity===other @value.remainder( @unit.convert(other) ) else self.class.new( @value.remainder(other), @expr, @unit ) end end |
#round(ndigits = nil) ⇒ Phys::Quantity
Round. Rounds self value to a given precision in decimal digits (default 0 digits). Returns a quantity with the rounded value in the same unit of self.
202 203 204 205 |
# File 'lib/phys/units/quantity.rb', line 202 def round(ndigits=nil) val = ndigits ? @value.round(ndigits) : @value.round self.class.new( val, @expr, @unit ) end |
#to_base_unit ⇒ Phys::Quantity Also known as: to_si, to_SI
Conversion to base unit. Returns the quantity converted to a base unit.
492 493 494 495 496 497 |
# File 'lib/phys/units/quantity.rb', line 492 def to_base_unit unit = @unit.base_unit val = unit.convert(self) expr = unit.unit_string self.class.new( val, expr, unit ) end |
#to_f ⇒ Float Also known as: to_float
Conversion to Float.
512 513 514 |
# File 'lib/phys/units/quantity.rb', line 512 def to_f to_numeric.to_f end |
#to_i ⇒ Integer Also known as: to_int, to_integer
Conversion to Integer.
520 521 522 |
# File 'lib/phys/units/quantity.rb', line 520 def to_i to_numeric.to_i end |
#to_numeric ⇒ Numeric Also known as: to_num
Conversion to Numeric.
504 505 506 |
# File 'lib/phys/units/quantity.rb', line 504 def to_numeric @unit.to_numeric * @value end |
#to_r ⇒ Rational Also known as: to_rational
Conversion to Rational.
529 530 531 |
# File 'lib/phys/units/quantity.rb', line 529 def to_r to_numeric.to_r end |
#to_s ⇒ String
Conversion to String.
536 537 538 539 540 541 542 543 |
# File 'lib/phys/units/quantity.rb', line 536 def to_s if @expr expr = ",'" +@expr+"'" else expr = "" end self.class.to_s+"["+Unit::Utils.num_inspect(@value)+expr+"]" end |
#truncate ⇒ Phys::Quantity
Truncate. Returns a quantity with the value truncated to an integer, in the same unit of self.
217 218 219 |
# File 'lib/phys/units/quantity.rb', line 217 def truncate self.class.new( @value.truncate, @expr, @unit ) end |
#want(unit = nil) ⇒ Phys::Quantity Also known as: convert, >>
Conversion to a quantity in another unit.
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/phys/units/quantity.rb', line 126 def want(unit=nil) case unit when Unit expr = unit.expr when Quantity expr = unit.expr unit = unit.unit when String,Symbol expr = unit unit = Unit.parse(expr) when Numeric unit = Unit.cast(unit) when NilClass unit = Unit.cast(1) else raise TypeError, "invalid argument: #{unit.inspect}" end val = unit.convert(self) self.class.new( val, expr, unit ) end |