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]
1720 1721 1722 1723 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 |
# File 'lib/when_exe/coordinates.rb', line 1720 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 は内部表現を使用する。
1319 1320 1321 |
# File 'lib/when_exe/coordinates.rb', line 1319 def base @base end |
#index_of_MSC ⇒ Integer (readonly)
年/日のインデクス(index of most significant coordinate)
1296 1297 1298 |
# File 'lib/when_exe/coordinates.rb', line 1296 def index_of_MSC @index_of_MSC end |
#indices ⇒ Array<When::Coordinates::Index> (readonly)
インデクスオブジェクト
1290 1291 1292 |
# File 'lib/when_exe/coordinates.rb', line 1290 def indices @indices end |
#origin_of_LSC ⇒ Integer (readonly)
日/秒の原点(origin of least significant coordinate)
1284 1285 1286 |
# File 'lib/when_exe/coordinates.rb', line 1284 def origin_of_LSC @origin_of_LSC end |
#origin_of_MSC ⇒ Integer (readonly)
年/日の原点(origin of most significant coordinate)
1278 1279 1280 |
# File 'lib/when_exe/coordinates.rb', line 1278 def origin_of_MSC @origin_of_MSC end |
#pair ⇒ Array<Boolean> (readonly)
日時要素がPairであるべきか
1329 1330 1331 |
# File 'lib/when_exe/coordinates.rb', line 1329 def pair @pair end |
#unit ⇒ Array<Integer, nil> (readonly)
日時要素の要素数
1306 1307 1308 |
# File 'lib/when_exe/coordinates.rb', line 1306 def unit @unit end |
Instance Method Details
#_arrange_length(period) ⇒ Array<Numeric>
期間指定用 Array の桁数合わせ
1378 1379 1380 1381 1382 1383 |
# File 'lib/when_exe/coordinates.rb', line 1378 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 属性
1388 1389 1390 |
# File 'lib/when_exe/coordinates.rb', line 1388 def _default_start ::Date::GREGORIAN end |
#_encode(source, border = @border) ⇒ Array<Numeric>
日時要素の encode
1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 |
# File 'lib/when_exe/coordinates.rb', line 1401 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: 日の境界が日没の場合、当該時刻が日没の前か後かで日付が変わる
日時要素の正規化
1368 1369 1370 |
# File 'lib/when_exe/coordinates.rb', line 1368 def _validate(source, other=nil, &block) return _encode(_decode(source, other, &block)) end |
#note ⇒ When::CalendarNote, Array<Array<klass, Array<klass, method, block>>>
代表暦注
1342 1343 1344 1345 1346 1347 1348 |
# File 'lib/when_exe/coordinates.rb', line 1342 def note case @note when String ; @note = When.CalendarNote(@note) when Array ; @note = When::CalendarNote.new(*@note) end @note end |