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
-
#base ⇒ Array<Integer, nil>
readonly
日時要素の下限.
-
#index_of_MSC ⇒ Integer
readonly
年/日のインデクス(index of most significant coordinate).
-
#indices ⇒ Array<When::Coordinates::Index>
readonly
インデクスオブジェクト.
-
#origin_of_LSC ⇒ Integer
readonly
日/秒の原点(origin of least significant coordinate).
-
#origin_of_MSC ⇒ Integer
readonly
年/日の原点(origin of most significant coordinate).
-
#pair ⇒ Array<Boolean>
readonly
日時要素がPairであるべきか.
-
#unit ⇒ Array<Integer, nil>
readonly
日時要素の要素数.
Instance Method Summary collapse
-
#_arrange_length(period) ⇒ Array<Numeric>
期間指定用 Array の桁数合わせ.
-
#_diff_to_CE ⇒ Integer
西暦との差.
-
#_encode(source, border = @border) ⇒ Array<Numeric>
日時要素の encode.
-
#_validate(source, other = nil, &block) ⇒ Array<Numeric>
日時要素の正規化.
-
#note ⇒ When::CalendarTypes::CalendarNote, Array<Array<klass, Array<klass, method, block>>>
代表暦注.
Methods included from Parts::MethodCash
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) に委譲する
1864 1865 1866 1867 1868 1869 |
# File 'lib/when_exe/coordinates.rb', line 1864 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
#base ⇒ Array<Integer, nil> (readonly)
日時要素の下限
1490 1491 1492 |
# File 'lib/when_exe/coordinates.rb', line 1490 def base @base end |
#index_of_MSC ⇒ Integer (readonly)
年/日のインデクス(index of most significant coordinate)
1470 1471 1472 |
# File 'lib/when_exe/coordinates.rb', line 1470 def index_of_MSC @index_of_MSC end |
#indices ⇒ Array<When::Coordinates::Index> (readonly)
インデクスオブジェクト
1464 1465 1466 |
# File 'lib/when_exe/coordinates.rb', line 1464 def indices @indices end |
#origin_of_LSC ⇒ Integer (readonly)
日/秒の原点(origin of least significant coordinate)
1458 1459 1460 |
# File 'lib/when_exe/coordinates.rb', line 1458 def origin_of_LSC @origin_of_LSC end |
#origin_of_MSC ⇒ Integer (readonly)
年/日の原点(origin of most significant coordinate)
1452 1453 1454 |
# File 'lib/when_exe/coordinates.rb', line 1452 def origin_of_MSC @origin_of_MSC end |
#pair ⇒ Array<Boolean> (readonly)
日時要素がPairであるべきか
1500 1501 1502 |
# File 'lib/when_exe/coordinates.rb', line 1500 def pair @pair end |
#unit ⇒ Array<Integer, nil> (readonly)
日時要素の要素数
1480 1481 1482 |
# File 'lib/when_exe/coordinates.rb', line 1480 def unit @unit end |
Instance Method Details
#_arrange_length(period) ⇒ Array<Numeric>
期間指定用 Array の桁数合わせ
1546 1547 1548 1549 1550 1551 |
# File 'lib/when_exe/coordinates.rb', line 1546 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_CE ⇒ Integer
西暦との差
1557 1558 1559 |
# File 'lib/when_exe/coordinates.rb', line 1557 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
1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 |
# File 'lib/when_exe/coordinates.rb', line 1570 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>
日付要素と時刻要素に関連がある場合、block を指定して、両者の 情報をやり取りする( yield で通日を渡し、通日を返してもらう)。
例1: 夏時間制を採用している場合、日付によって時刻の正規化の仕方が影響を受ける
例2: 日の境界が日没の場合、当該時刻が日没の前か後かで日付が変わる
日時要素の正規化
1536 1537 1538 |
# File 'lib/when_exe/coordinates.rb', line 1536 def _validate(source, other=nil, &block) return _encode(_decode(source, other, &block)) end |