Class: When::Coordinates::Pair

Inherits:
Numeric
  • Object
show all
Defined in:
lib/when_exe/coordinates.rb,
lib/when_exe/inspect.rb

Overview

暦座標値

暦座標の値を表現する

Direct Known Subclasses

LeapSeconds

Constant Summary collapse

DL0 =
{'-'=> 0,   '.'=> 0, ':'=> 0,   ','=> 0, ' '=> 0, '@'=>-2 }
DL1 =
{'!'=>-2.5, '%'=>-2, '&'=>-1.5, '*'=>-1, '+'=>-0.5,
'<'=> 0.5, '='=> 1, '>'=> 1.5, '?'=> 2 }
DL2 =
DL1.invert

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Numeric

#clock, #to_day_of_week, #to_month_name, #to_pair, #unit_duration, #unit_interval_length, #unit_period_duration

Methods included from TM::TemporalPosition::Conversion

#julian_date, #tm_pos

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

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

その他のメソッド

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


1131
1132
1133
1134
1135
1136
1137
1138
# File 'lib/when_exe/coordinates.rb', line 1131

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

Instance Attribute Details

#branchNumeric

暦要素の枝

Returns:

  • (Numeric)

    暦要素のうち(閏であるかなど)幹で表現しきれない枝の部分



943
944
945
# File 'lib/when_exe/coordinates.rb', line 943

def branch
  @branch
end

#sumNumeric (readonly)

Note:

個別の実装において、本変数が When::TM::Calendar や When::TM::Clock が扱うべき 座標値を表すように配慮されている。

例: 会計年度など年の変わり目が暦年と異なる場合、trunk+=1, branch-=1 として、

trunk が会計年度, sum が暦年を表現するようにできる。この場合、trunk は表記上の
年、branch は会計年度と暦年にずれがあるという情報を表現していることになる。

暦要素の幹と枝の和

Returns:



958
959
960
# File 'lib/when_exe/coordinates.rb', line 958

def sum
  @sum
end

#trunkNumeric

暦要素の幹

Returns:

  • (Numeric)

    年番号,月番号,日番号など暦要素の幹となる部分



936
937
938
# File 'lib/when_exe/coordinates.rb', line 936

def trunk
  @trunk
end

Class Method Details

._de_pair(source) ⇒ Numeric+

When::Coordinates::Pair の trunk と branch の和をとって Numeric 化する

Parameters:

  • source (When::Coordinates::Pair)

    trunk と branch の和を返す

  • source (Array)

    各要素を _de_pair した Arrayを返す

  • source (その他 Numeric)

    をそのまま返す

Returns:



850
851
852
853
854
855
856
857
858
859
860
861
# File 'lib/when_exe/coordinates.rb', line 850

def _de_pair(source)
  case source
  when Array
    return (source.map!{|v| _de_pair(v)})
  when self
    return source.sum
  when Numeric
    return source
  else
    raise TypeError, "Irregal type for #{self}"
  end
end

._en_number(source, default = 0) ⇒ Numeric

source を Numeric に変換する

Parameters:

  • source (Object)
  • default (Numeric) (defaults to: 0)

    source が nil の場合の代替値

Returns:



792
793
794
795
796
797
# File 'lib/when_exe/coordinates.rb', line 792

def _en_number(source, default=0)
  return default unless(source)
  integer = source.to_i
  float   = source.to_f
  return (integer==float) ? integer : float
end

._en_pair(trunk, branch = nil) ⇒ trunk自体, When::Coordinates::Pair

branch が有効なら (source, branch) を When::Coordinates::Pair に変換する。

Parameters:

Returns:



833
834
835
836
837
838
839
# File 'lib/when_exe/coordinates.rb', line 833

def _en_pair(trunk, branch=nil)
  return trunk if (trunk.kind_of?(self))
  branch = DL0[branch] || DL1[branch] || branch
  trunk  = _en_number(trunk) if (trunk)
  return trunk unless (branch && branch != 0)
  return new(trunk, branch)
end

._en_pair_array(source) ⇒ Array<When::Coordinates::Pair>

文字列を When::Coordinates::Pair のArray 化する

Parameters:

Returns:



870
871
872
873
874
875
876
# File 'lib/when_exe/coordinates.rb', line 870

def _en_pair_array(source)
  source = $1 if source=~/\A\s*\[?(.+?)\]?\s*\z/
  source.split(/,/).map {|v|
     v =~ /\A\s*(.+?)([^\d\s])?\s*\z/
     _en_pair($1, $2)
  }
end

._en_pair_date_time(source) ⇒ Array<When::Coordinates::Pair>

日付を When::Coordinates::Pair のArray 化する

Parameters:

Returns:



885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
# File 'lib/when_exe/coordinates.rb', line 885

def _en_pair_date_time(source)
  source = $1 if source =~ /\A\s*\[(.+)\]\s*\z/
  trunk, branch, *rest = source.strip.split(/([^\d])/)
  if trunk == ''
    sign = branch
    trunk, branch, *rest = rest
    trunk = sign + trunk if trunk
  end
  pairs = []
  while (trunk)
    pairs << _en_pair(trunk, branch)
    trunk, branch, *rest = rest
  end
  return pairs
end

._force_pair(source, branch = nil) ⇒ When::Coordinates::Pair

(source, branch) を When::Coordinates::Pair に変換する

Parameters:

  • source (Object)
  • branch (Numeric) (defaults to: nil)

Returns:



807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
# File 'lib/when_exe/coordinates.rb', line 807

def _force_pair(source, branch=nil)
  case source
  when self
    return source
  when Numeric
    return new(_en_number(source), branch)
  when String
    tail   = source[-1..-1]
    branch = DL0[tail] || DL1[tail]
    source = (branch) ? source[0..-2] : source.dup
    trunk  = (source =~ /\.|E/i) ? source.to_f : source.to_i
    return new(trunk, branch)
  else
    raise TypeError, "Irregal type for #{self} :#{source}"
  end
end

._format(format, list) ⇒ String

Note:

%0s は文字列引数の表示を抑制するための指定となる。C言語のprintfと異なるので注意。

branch文字を意識して、書式文字列により When::Coordinates::Pair の Array を文字列化

Parameters:

  • format (String)

    書式文字列

  • list (Array)

    書式に従って文字列化されるオブジェクトの Array

Returns:



912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
# File 'lib/when_exe/coordinates.rb', line 912

def _format(m17ns)
  index = 1
  m17ns[0].scan(/(%(?:(\d)\$)?[-+0# ]?[*\d.$]*[cspdiuboxXfgeEG])([-.:])?|(%%|.)/).inject('') { |form, m17n|
    t,i,s,c = m17n
    case t
    when '%0s'
      m17n[index..index] = nil
    when nil
      form  += c
    else
      suffix = DL2[m17ns[i ? i.to_i : index]*0]  || s if s
      form  += t + ({nil=>'', '%'=>'%%'}[suffix] || suffix)
      index += t.length - t.gsub(/\*/,'').length + 1
    end
    form
  } % m17ns[1..-1].map { |v| v.kind_of?(self) ? v.trunk : v }
end

Instance Method Details

#%(other) ⇒ When::Coordinates::Pair

剰余

Parameters:

Returns:



1073
1074
1075
# File 'lib/when_exe/coordinates.rb', line 1073

def %(other)
  self.class.new(@trunk % other, @branch)
end

#*(other) ⇒ Numeric

Note:

When::Coordinates::Pair 以外の Numeric では、1 による乗算は恒等変換になる。 また、0 による乗算は恒に 0になる。 このため、When::TM::Calendar や When::TM::Clock の実装は、暦要素が When::Coordinates::Pair か 否かを判断することなく、暦要素に 1 による乗算を施すことによって、trunk に相当する値を、 0 による乗算を施すことによって、branch に相当する値を取得できる。

@trunk, @branch を取得する

Parameters:

  • other (Integer)

    (1, 0, -1)

Returns:

  • (Numeric)
    other == 1 - @trunk
    other == 0 - @branch
    other == -1 - -@trunk


1021
1022
1023
1024
1025
1026
1027
1028
# File 'lib/when_exe/coordinates.rb', line 1021

def *(other)
  case other
  when  1 ;  @trunk
  when  0 ;  @branch
  when -1 ; -@trunk
  else    ; raise ArgumentError, "Irregal designation : #{other}"
  end
end

#+(other) ⇒ When::Coordinates::Pair

加算

Parameters:

Returns:

  • (When::Coordinates::Pair)

    other が When::Coordinates::Pair でない場合、trunk に対する加算となる



1037
1038
1039
1040
# File 'lib/when_exe/coordinates.rb', line 1037

def +(other)
  return self.class.new(@trunk + other, @branch) unless other.kind_of?(self.class)
  return self.class.new(@trunk + other.trunk, @branch + other.branch)
end

#+@Numeric

Note:

When::Coordinates::Pair 以外の Numeric では、単項演算 + は恒等変換になる。 このため、When::TM::Calendar や When::TM::Clock の実装は、暦要素が When::Coordinates::Pair か 否かを判断することなく、暦要素に単項演算 + を施すことによって、必要な暦要素を取得できる。

属性 @sum を取得する

Returns:



994
995
996
# File 'lib/when_exe/coordinates.rb', line 994

def +@
  return  @sum
end

#-(other) ⇒ When::Coordinates::Pair

減算

Parameters:

Returns:

  • (When::Coordinates::Pair)

    other が When::Coordinates::Pair でない場合、trunk に対する減算となる



1049
1050
1051
1052
# File 'lib/when_exe/coordinates.rb', line 1049

def -(other)
  return self.class.new(@trunk - other, @branch) unless other.kind_of?(self.class)
  return self.class.new(@trunk - other.trunk, @branch - other.branch)
end

#-@When::Coordinates::Pair

trunk の符号を反転する

Returns:



1002
1003
1004
# File 'lib/when_exe/coordinates.rb', line 1002

def -@
  return self.class.new(-@trunk, @branch)
end

#<=>(other) ⇒ Integer

比較

Parameters:

Returns:

  • (Integer)

    (負,0,正) trunk の比較が優先される



1084
1085
1086
1087
# File 'lib/when_exe/coordinates.rb', line 1084

def <=>(other)
  other = self.class._force_pair(other)
  (@trunk <=> other.trunk).nonzero? || (@branch <=> other.branch)
end

#_to_hash_value(options = {}) ⇒ String, When::Coordinates::Pair

to_h のための要素生成

Parameters:

  • options (Hash) (defaults to: {})

    下記のとおり

Options Hash (options):

  • :method (Symbol)

    :to_m17n なら to_s を返す、その他は self を返す

Returns:



174
175
176
# File 'lib/when_exe/inspect.rb', line 174

def _to_hash_value(options={})
  options[:method] == :to_m17n ? to_s : self
end

#coerce(other) ⇒ Object

強制型変換



1101
1102
1103
# File 'lib/when_exe/coordinates.rb', line 1101

def coerce(other)
  [self.class._force_pair(other), self]
end

#divmod(other) ⇒ When::Coordinates::Pair

商と剰余

Parameters:

Returns:



1061
1062
1063
1064
# File 'lib/when_exe/coordinates.rb', line 1061

def divmod(other)
  div, mod = @trunk.divmod(other)
  return div, self.class.new(mod, @branch)
end

#inspectString

When::Coordinates::Pair オブジェクトを分かりやすい文字列にして返します

Returns:



182
183
184
# File 'lib/when_exe/inspect.rb', line 182

def inspect
  When::EncodingConversion.to_external_encoding(to_s)
end

#to_s(zero = '') ⇒ String

文字列化

Parameters:

  • zero (String) (defaults to: '')

    @branch == 0 を表現する文字列

Returns:



1095
1096
1097
# File 'lib/when_exe/coordinates.rb', line 1095

def to_s(zero='')
  return @trunk.to_s + (@branch==0 ? zero : DL2[@branch])
end