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], [:epoch_in_CE, 0], :unit, :base, :pair, :note, :location, :time_basis, :border, :formula, :domain]
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 属性.
-
#_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]
1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 |
# File 'lib/when_exe/coordinates.rb', line 1724 def method_missing(name, *args, &block) unless When::Parts::MethodCash::Escape.key?(name) if note.respond_to?(name) if note.class::CalendarDepend 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) else instance_eval %Q{ def #{name}(*args, &block) @note.send("#{name}", *args, &block) end } unless When::Parts::MethodCash.escape(name) return @note.send(name, *args, &block) end 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) extend When::Ephemeris::Formula::ForwardedFormula @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 は内部表現を使用する。
1323 1324 1325 |
# File 'lib/when_exe/coordinates.rb', line 1323 def base @base end |
#index_of_MSC ⇒ Integer (readonly)
年/日のインデクス(index of most significant coordinate)
1300 1301 1302 |
# File 'lib/when_exe/coordinates.rb', line 1300 def index_of_MSC @index_of_MSC end |
#indices ⇒ Array<When::Coordinates::Index> (readonly)
インデクスオブジェクト
1294 1295 1296 |
# File 'lib/when_exe/coordinates.rb', line 1294 def indices @indices end |
#origin_of_LSC ⇒ Integer (readonly)
日/秒の原点(origin of least significant coordinate)
1288 1289 1290 |
# File 'lib/when_exe/coordinates.rb', line 1288 def origin_of_LSC @origin_of_LSC end |
#origin_of_MSC ⇒ Integer (readonly)
年/日の原点(origin of most significant coordinate)
1282 1283 1284 |
# File 'lib/when_exe/coordinates.rb', line 1282 def origin_of_MSC @origin_of_MSC end |
#pair ⇒ Array<Boolean> (readonly)
日時要素がPairであるべきか
1333 1334 1335 |
# File 'lib/when_exe/coordinates.rb', line 1333 def pair @pair end |
#unit ⇒ Array<Integer, nil> (readonly)
日時要素の要素数
1310 1311 1312 |
# File 'lib/when_exe/coordinates.rb', line 1310 def unit @unit end |
Instance Method Details
#_arrange_length(period) ⇒ Array<Numeric>
期間指定用 Array の桁数合わせ
1382 1383 1384 1385 1386 1387 |
# File 'lib/when_exe/coordinates.rb', line 1382 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 属性
1392 1393 1394 |
# File 'lib/when_exe/coordinates.rb', line 1392 def _default_start ::Date::GREGORIAN end |
#_encode(source, border = @border) ⇒ Array<Numeric>
日時要素の encode
1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 |
# File 'lib/when_exe/coordinates.rb', line 1405 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: 日の境界が日没の場合、当該時刻が日没の前か後かで日付が変わる
日時要素の正規化
1372 1373 1374 |
# File 'lib/when_exe/coordinates.rb', line 1372 def _validate(source, other=nil, &block) return _encode(_decode(source, other, &block)) end |
#note ⇒ When::CalendarNote, Array<Array<klass, Array<klass, method, block>>>
代表暦注
1346 1347 1348 1349 1350 1351 1352 |
# File 'lib/when_exe/coordinates.rb', line 1346 def note case @note when String ; @note = When.CalendarNote(@note) when Array ; @note = When::CalendarNote.new(*@note) end @note end |