Module: When::Coordinates::Temporal
- Includes:
- 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, :time_basis, :border, :formula]
Constants included from Parts::MethodCash
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 の桁数合わせ.
-
#_default_start ⇒ Object
対応する ::Date の start 属性.
-
#_diff_to_CE ⇒ Integer
西暦との差.
-
#_encode(source, border = @border) ⇒ Array<Numeric>
日時要素の encode.
-
#_validate(source, other = nil, &block) ⇒ Array<Numeric>
日時要素の正規化.
-
#note ⇒ When::CalendarNote, Array<Array<klass, Array<klass, method, block>>>
代表暦注.
Methods included from Parts::MethodCash
_setup_, _setup_info, escape, #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 で定義されていないメソッドは
処理を下記に移譲する(番号は優先順位)
When::CalendarNote
(1) @note
(2) SolarTerms
(3) LunarPhases
When::Ephemeris::Formula
(4)@formula[0]
2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 |
# File 'lib/when_exe/coordinates.rb', line 2047 def method_missing(name, *args, &block) unless When::Parts::MethodCash::Escape.key?(name) if note.respond_to?(name) instance_eval %Q{ def #{name}(*args, &block) @note.send("#{name}", *(args + [self]), &block) end } unless When::Parts::MethodCash.escape(name) return @note.send(name, *(args + [self]), &block) end ['SolarTerms', 'LunarPhases'].each do |note| if When.CalendarNote(note).respond_to?(name) instance_eval %Q{ def #{name}(*args, &block) When.CalendarNote("#{note}").send("#{name}", *args, &block) end } unless When::Parts::MethodCash.escape(name) return When.CalendarNote(note).send(name, *args, &block) end end if When::Ephemeris::Formula.method_defined?(name) unless respond_to?(:forwarded_formula, true) instance_eval('class << self; include When::Ephemeris::Formula::ForwardedFormula; end') @formula ||= When::Ephemeris::Formula.new({:location=>@location}) @formula = When.Resource(Array(@formula), '_ep:') end instance_eval %Q{ def #{name}(*args, &block) forward = forwarded_formula("#{name}", args[0]) return forward.send("#{name}", *args, &block) if forward _method_missing("#{name}", *args, &block) end } unless When::Parts::MethodCash.escape(name) forward = forwarded_formula(name, args[0]) return forward.send(name, *args, &block) if forward end end _method_missing(name, *args, &block) end |
Instance Attribute Details
#base ⇒ Array<Integer, nil> (readonly)
日付/日時の外部表現の「下限」を指定する。内部表現の下限は常に 0 である。
日時要素の下限
サブクラスが定義するメソッド _coordinates_to_number, _number_to_coordinates は内部表現を使用する。
1659 1660 1661 |
# File 'lib/when_exe/coordinates.rb', line 1659 def base @base end |
#index_of_MSC ⇒ Integer (readonly)
年/日のインデクス(index of most significant coordinate)
1636 1637 1638 |
# File 'lib/when_exe/coordinates.rb', line 1636 def index_of_MSC @index_of_MSC end |
#indices ⇒ Array<When::Coordinates::Index> (readonly)
インデクスオブジェクト
1630 1631 1632 |
# File 'lib/when_exe/coordinates.rb', line 1630 def indices @indices end |
#origin_of_LSC ⇒ Integer (readonly)
日/秒の原点(origin of least significant coordinate)
1624 1625 1626 |
# File 'lib/when_exe/coordinates.rb', line 1624 def origin_of_LSC @origin_of_LSC end |
#origin_of_MSC ⇒ Integer (readonly)
年/日の原点(origin of most significant coordinate)
1618 1619 1620 |
# File 'lib/when_exe/coordinates.rb', line 1618 def origin_of_MSC @origin_of_MSC end |
#pair ⇒ Array<Boolean> (readonly)
日時要素がPairであるべきか
1669 1670 1671 |
# File 'lib/when_exe/coordinates.rb', line 1669 def pair @pair end |
#unit ⇒ Array<Integer, nil> (readonly)
日時要素の要素数
1646 1647 1648 |
# File 'lib/when_exe/coordinates.rb', line 1646 def unit @unit end |
Instance Method Details
#_arrange_length(period) ⇒ Array<Numeric>
期間指定用 Array の桁数合わせ
1715 1716 1717 1718 1719 1720 |
# File 'lib/when_exe/coordinates.rb', line 1715 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 |
#_default_start ⇒ Object
対応する ::Date の start 属性
1733 1734 1735 |
# File 'lib/when_exe/coordinates.rb', line 1733 def _default_start ::Date::GREGORIAN end |
#_diff_to_CE ⇒ Integer
西暦との差
1726 1727 1728 |
# File 'lib/when_exe/coordinates.rb', line 1726 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
1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 |
# File 'lib/when_exe/coordinates.rb', line 1746 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: 日の境界が日没の場合、当該時刻が日没の前か後かで日付が変わる
日時要素の正規化
1705 1706 1707 |
# File 'lib/when_exe/coordinates.rb', line 1705 def _validate(source, other=nil, &block) return _encode(_decode(source, other, &block)) end |