Module: When::Coordinates::Temporal

Includes:
Spatial::Normalize, Parts::MethodCash
Defined in:
lib/when_exe/coordinates.rb

Overview

暦座標を扱う処理をまとめたモジュール

When::TM::Calendar と When::TM::Clock に共通する処理だが、ISO 19108 で両者の
直接の superclass である、When::TM::ReferenceSystem は、これらの処理を持たない
こととなっているため、When::TM::Calendar と When::TM::Clock の共通部分を
モジュールとしてまとめた。

Defined Under Namespace

Modules: IndexConversion, OriginAndUpperDigits, OriginOnly

Constant Summary collapse

HashProperty =
[[:origin_of_MSC, 0], [:origin_of_LSC, 0], [:index_of_MSC, 0], [:_diff_to_CE, 0], 
:unit, :base, :pair, :note,
:location, :timezone, :border, :formula]

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Parts::MethodCash

#method_missing_

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

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

その他のメソッド

When::Coordinates::Temporal で定義されていないメソッドは
処理を @note or @formula[0] (When::Ephemeris::Formula) に委譲する


1874
1875
1876
1877
1878
1879
# File 'lib/when_exe/coordinates.rb', line 1874

def method_missing(name, *args, &block)
  return @note.send(name.to_sym, *(args + [self]), &block) if note.respond_to?(name)
  forward = forwarded_formula(name, args[0]) if self.respond_to?(:forwarded_formula, true)
  return forward.send(name.to_sym, *args, &block) if forward
  _method_missing(name, *args, &block)
end

Instance Attribute Details

#baseArray<Integer, nil> (readonly)

Note:

日付/日時の外部表現の「下限」を指定する。内部表現の下限は常に 0 である。

日時要素の下限

サブクラスが定義するメソッド _coordinates_to_number, _number_to_coordinates は内部表現を使用する。

Returns:

  • (Array<Integer, nil>)

    Ex. [nil, 1, 1], [nil, 0, 0, 0]

    初期化時に indices から自動生成する



1500
1501
1502
# File 'lib/when_exe/coordinates.rb', line 1500

def base
  @base
end

#index_of_MSCInteger (readonly)

年/日のインデクス(index of most significant coordinate)

Returns:

  • (Integer)


1477
1478
1479
# File 'lib/when_exe/coordinates.rb', line 1477

def index_of_MSC
  @index_of_MSC
end

#indicesArray<When::Coordinates::Index> (readonly)

インデクスオブジェクト



1471
1472
1473
# File 'lib/when_exe/coordinates.rb', line 1471

def indices
  @indices
end

#origin_of_LSCInteger (readonly)

日/秒の原点(origin of least significant coordinate)

Returns:

  • (Integer)


1465
1466
1467
# File 'lib/when_exe/coordinates.rb', line 1465

def origin_of_LSC
  @origin_of_LSC
end

#origin_of_MSCInteger (readonly)

年/日の原点(origin of most significant coordinate)

Returns:

  • (Integer)


1459
1460
1461
# File 'lib/when_exe/coordinates.rb', line 1459

def origin_of_MSC
  @origin_of_MSC
end

#pairArray<Boolean> (readonly)

日時要素がPairであるべきか

Returns:

  • (Array<Boolean>)

    Ex. [false] * 3, [false] * 4

    初期化時に indices から自動生成する



1510
1511
1512
# File 'lib/when_exe/coordinates.rb', line 1510

def pair
  @pair
end

#unitArray<Integer, nil> (readonly)

日時要素の要素数

Returns:

  • (Array<Integer, nil>)

    Ex. [nil, 12], [nil, 24, 60, 60]

    初期化時に indices から自動生成する



1487
1488
1489
# File 'lib/when_exe/coordinates.rb', line 1487

def unit
  @unit
end

Instance Method Details

#_arrange_length(period) ⇒ Array<Numeric>

期間指定用 Array の桁数合わせ

Parameters:

Returns:



1556
1557
1558
1559
1560
1561
# File 'lib/when_exe/coordinates.rb', line 1556

def _arrange_length(period)
  return period unless period.kind_of?(Array)
  diff = @indices.length - period.length + 1
  return period if (diff == 0)
  return (diff > 0) ? Array.new(diff, 0) + period : period[(-diff)..-1]
end

#_diff_to_CEInteger

西暦との差

Returns:

  • (Integer)

    暦法の年の桁と西暦とのずれ



1567
1568
1569
# File 'lib/when_exe/coordinates.rb', line 1567

def _diff_to_CE
  @_diff_to_CE ||= @epoch_in_CE ? @epoch_in_CE - @origin_of_MSC : 0
end

#_encode(source, border = @border) ⇒ Array<Numeric>

日時要素の encode

Parameters:

  • source (Array<Numeric>)

    日時要素の内部表現に対応する Array

Returns:

  • (Array<Numeric>)

    日時要素の外部表現に対応する Array



1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
# File 'lib/when_exe/coordinates.rb', line 1580

def _encode(source, border=@border)
  # source は非破壊
  date = source.dup

  # 外部表現に戻す
  date[0] = +date[0]
  (@base.length-1).downto(@unit.length-1) do |i|
    date[i] = _from_index(date[0..i]) || date[i] + (@base[i]||0)
  end
  date[0] = source[0]

  # 結果を反映
  date = border._adjust_epoch(date, self) if border
  _encode_upper_structure(date)
end

#_validate(source, other = nil, &block) ⇒ Array<Numeric>

Note:

日付要素と時刻要素に関連がある場合、block を指定して、両者の 情報をやり取りする( yield で通日を渡し、通日を返してもらう)。

例1: 夏時間制を採用している場合、日付によって時刻の正規化の仕方が影響を受ける

例2: 日の境界が日没の場合、当該時刻が日没の前か後かで日付が変わる

日時要素の正規化

Parameters:

  • source (Array<Numeric>)

    正規化しようとしている日時要素の Array

  • other (Array<Numeric>) (defaults to: nil)

    日時要素ごとに加減算を行う場合、加減算量の Array を指定する

  • block (Block)

Returns:

  • (Array<Numeric>)

    正規化された日時要素の Array

    日時要素は、それぞれの When::TM::Calendar や When::TM::Clock の実装に応じて有効な値となっている。



1546
1547
1548
# File 'lib/when_exe/coordinates.rb', line 1546

def _validate(source, other=nil, &block)
  return _encode(_decode(source, other, &block))
end

#noteWhen::CalendarTypes::CalendarNote, Array<Array<klass, Array<klass, method, block>>>

代表暦注

Returns:

  • (When::CalendarTypes::CalendarNote)
  • (Array<Array<klass, Array<klass, method, block>>>)

    最外側のArray要素は年・月・日に対応

    klass [String, When::CalendarTypes::CalendarNote, When::Coordinates::Residue]

    method [String, Symbol] (デフォルト ‘day’, ‘month’ or ‘year’ (対応する桁による))

    block [Block] (デフォルト なし)



1523
1524
1525
1526
# File 'lib/when_exe/coordinates.rb', line 1523

def note
  @note = When.CalendarNote(@note) if @note.kind_of?(String)
  @note
end