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

Parts::MethodCash::Escape

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#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 から自動生成する



1323
1324
1325
# File 'lib/when_exe/coordinates.rb', line 1323

def base
  @base
end

#index_of_MSCInteger (readonly)

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

Returns:

  • (Integer)


1300
1301
1302
# File 'lib/when_exe/coordinates.rb', line 1300

def index_of_MSC
  @index_of_MSC
end

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

インデクスオブジェクト



1294
1295
1296
# File 'lib/when_exe/coordinates.rb', line 1294

def indices
  @indices
end

#origin_of_LSCInteger (readonly)

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

Returns:

  • (Integer)


1288
1289
1290
# File 'lib/when_exe/coordinates.rb', line 1288

def origin_of_LSC
  @origin_of_LSC
end

#origin_of_MSCInteger (readonly)

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

Returns:

  • (Integer)


1282
1283
1284
# File 'lib/when_exe/coordinates.rb', line 1282

def origin_of_MSC
  @origin_of_MSC
end

#pairArray<Boolean> (readonly)

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

Returns:

  • (Array<Boolean>)

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

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



1333
1334
1335
# File 'lib/when_exe/coordinates.rb', line 1333

def pair
  @pair
end

#unitArray<Integer, nil> (readonly)

日時要素の要素数

Returns:

  • (Array<Integer, nil>)

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

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



1310
1311
1312
# File 'lib/when_exe/coordinates.rb', line 1310

def unit
  @unit
end

Instance Method Details

#_arrange_length(period) ⇒ Array<Numeric>

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

Parameters:

Returns:



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_startObject

対応する ::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

Parameters:

  • source (Array<Numeric>)

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

Returns:

  • (Array<Numeric>)

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



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>

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 の実装に応じて有効な値となっている。



1372
1373
1374
# File 'lib/when_exe/coordinates.rb', line 1372

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

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

代表暦注

Returns:

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

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

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

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

    block [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