Class: When::TM::IntervalLength

Inherits:
Duration
  • Object
show all
Defined in:
lib/when_exe/tmobjects.rb

Overview

ISO 11404 の時間間隔に基づいて定義された When::TM::Duration の subclass

see gml schema

Constant Summary collapse

Alias =
{'Y'=>'year', 'M'=>'month' , 'D'=>'day', 'W'=>'week', 'S'=>'system',
'h'=>'hour', 'm'=>'minute', 's'=>'second'}

Constants inherited from Duration

Duration::DAY, Duration::DurationUnits, Duration::HOUR, Duration::MINUTE, Duration::MONTH, Duration::SECOND, Duration::SYSTEM, Duration::Unit, Duration::UnitName, Duration::WEEK, Duration::YEAR

Instance Attribute Summary collapse

Attributes inherited from Duration

#duration

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Duration

#<=>, #==, #[], #_enumerator, #abs, #after, #before, #coerce, dhms, #rational_duration, #sign, #to_as_duration, #to_dhms, #to_duration, #to_f, #to_i, #to_period_duration, unit

Constructor Details

#initialize(value, unit = 'system', factor = 0, radix = 10) ⇒ IntervalLength

オブジェクトの生成

Raises:

  • (TypeError)

820
821
822
823
824
825
826
827
828
# File 'lib/when_exe/tmobjects.rb', line 820

def initialize(value, unit='system', factor=0, radix=10)
  @value, @factor, @radix = value, factor, radix
  @unit_quantity   = Unit[unit.downcase] || Unit[Alias[unit[0..0]]] if unit.kind_of?(String)
  @unit_quantity ||= unit.to_f
  raise TypeError, "Wrong Unit Type: #{unit}" unless @unit_quantity.kind_of?(Numeric)
  @unit = UnitName[@unit_quantity] ||
          When::Coordinates::Pair._en_number(@unit_quantity).to_s
  @duration = @value * @radix ** (-@factor) * @unit_quantity
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object (private)

Note:

When::TM::IntervalLength で定義されていないメソッドは 処理を @duration (type:Numeric) に委譲する

その他のメソッド


853
854
855
856
857
858
859
860
# File 'lib/when_exe/tmobjects.rb', line 853

def method_missing(name, *args, &block)
  self.class.module_eval %Q{
    def #{name}(*args, &block)
      @duration.send("#{name}", *args, &block)
    end
  } unless When::Parts::MethodCash.escape(name)
  @duration.send(name, *args, &block)
end

Instance Attribute Details

#factorInteger (readonly)

基底のべき乗を行う指数


660
661
662
# File 'lib/when_exe/tmobjects.rb', line 660

def factor
  @factor
end

#radixInteger (readonly)

時間単位となる乗数の基底となる正の整数


654
655
656
# File 'lib/when_exe/tmobjects.rb', line 654

def radix
  @radix
end

#unitString (readonly)

時間間隔を表現するために使用した測定単位の名称


648
649
650
# File 'lib/when_exe/tmobjects.rb', line 648

def unit
  @unit
end

#unit_quantityNumeric (readonly)

測定単位の大きさ


674
675
676
# File 'lib/when_exe/tmobjects.rb', line 674

def unit_quantity
  @unit_quantity
end

#valueNumeric

時間間隔の長さ / 測定単位


666
667
668
# File 'lib/when_exe/tmobjects.rb', line 666

def value
  @value
end

Class Method Details

._to_array(interval) ⇒ Array<Numeric, String>

Note:

value, factor, radix は Numeric

Interval Length 形式の表現を分解して配列化する


622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
# File 'lib/when_exe/tmobjects.rb', line 622

def self._to_array(interval)
  return nil unless interval =~ /^([-+]?[\d.]+)(?:(E|X|\((\d+)\))([-+]?\d+))?([A-Za-z]+|\*([\d.]+)S)$/
  value, radix, radix_quantity, factor, unit, unit_quantity = $~[1..6]
  value  = When::Coordinates::Pair._en_number(value)
  radix  = case radix
           when 'E', nil ; 10
           when 'X'      ; 60
           else          ; radix_quantity.to_i
           end
  factor = factor ? -factor.to_i : 0
  return [value, unit_quantity, factor, radix] if unit_quantity
  unit_quantity = Unit[unit.downcase] || Unit[Alias[unit[0..0]]]
  return [value,  UnitName[unit_quantity], factor, radix] if unit_quantity
  return nil
end

.difference(ended, begun) ⇒ When::TM::IntervalLength

オブジェクトの生成(終点と始点を指定)


839
840
841
842
843
# File 'lib/when_exe/tmobjects.rb', line 839

def self.difference(ended, begun)
  precision = [ended.precision, begun.precision].min
  return new(ended-begun) if precision > When::DAY
  return new(ended.to_i - begun.to_i, unit='day')
end

Instance Method Details

#*(times) ⇒ When::TM::IntervalLength

乗算


763
764
765
766
767
768
# File 'lib/when_exe/tmobjects.rb', line 763

def *(times)
  interval = self.dup
  interval.value    = times * @value
  interval.duration = times * @duration
  return interval
end

#+(other) ⇒ When::TM::IntervalLength, other と同じクラス

加算


730
731
732
733
734
735
736
737
738
739
740
# File 'lib/when_exe/tmobjects.rb', line 730

def +(other)
  case other
  when Duration ; diff = other.duration
  when Numeric  ; diff = other * SECOND
  else          ; return other + self
  end
  interval = self.dup
  interval.duration = @duration + diff
  internal.value    = interval.duration / (@radix ** (-@factor) * @unit_quantity)
  return interval
end

#-(other) ⇒ When::TM::IntervalLength

減算


750
751
752
753
754
755
# File 'lib/when_exe/tmobjects.rb', line 750

def -(other)
  interval = self.dup
  interval.duration = @duration - (other.kind_of?(Duration) ? other.duration : other * SECOND)
  internal.value    = interval.duration / (@radix ** (-@factor) * @unit_quantity)
  return interval
end

#[email protected]When::TM::IntervalLength

符号反転


713
714
715
716
717
718
# File 'lib/when_exe/tmobjects.rb', line 713

def [email protected]
  interval = self.dup
  interval.value    = -@value
  interval.duration = -@duration
  return interval
end

#/(other) ⇒ When::TM::IntervalLength, Numeric

除算


779
780
781
# File 'lib/when_exe/tmobjects.rb', line 779

def /(other)
  other.kind_of?(Duration) ? @duration / other.duration : self * (1.0 / other)
end

#datenil

日付配列


694
695
696
# File 'lib/when_exe/tmobjects.rb', line 694

def date
  nil
end

#timeNumeric

時刻配列


683
684
685
# File 'lib/when_exe/tmobjects.rb', line 683

def time
  [0, 0, @duration / SECOND]
end

#to_interval_lengthWhen::TM::IntervalLength

When::TM::IntervalLength への変換


808
809
810
# File 'lib/when_exe/tmobjects.rb', line 808

def to_interval_length
  self.dup
end

#to_sString

文字列化


787
788
789
790
791
792
793
794
795
796
797
798
799
# File 'lib/when_exe/tmobjects.rb', line 787

def to_s
  expression = @value.to_s
  unless @factor == 0
    case @radix
    when 10 ; expression += 'E'
    when 60 ; expression += 'X'
    else    ; expression += '(%d)' % @radix
    end
    expression += '%+d' % (-@factor)
  end
  expression += Alias.invert[@unit] || "*#{When::Coordinates::Pair._en_number(@unit)}S"
  return expression
end

#weeksnil

暦週配列


705
706
707
# File 'lib/when_exe/tmobjects.rb', line 705

def weeks
  nil
end