Class: When::Coordinates::Pair
- Defined in:
- lib/when_exe/coordinates.rb,
lib/when_exe/inspect.rb
Overview
暦座標値
暦座標の値を表現する
Direct Known Subclasses
Constant Summary collapse
- DL0 =
{'-'=> 0, '.'=> 0, ':'=> 0, ','=> 0, ' '=> 0, '@'=>-2 }
- DL1 =
{'!'=>-2.5, '%'=>-2, '&'=>-1.5, '*'=>-1, '+'=>-0.5, '<'=> 0.5, '='=> 1, '>'=> 1.5, '?'=> 2 }
- DL2 =
DL1.invert
Instance Attribute Summary collapse
-
#branch ⇒ Numeric
暦要素の枝.
-
#sum ⇒ Numeric
readonly
暦要素の幹と枝の和.
-
#trunk ⇒ Numeric
暦要素の幹.
Class Method Summary collapse
-
._de_pair(source) ⇒ Numeric+
When::Coordinates::Pair の trunk と branch の和をとって Numeric 化する.
-
._en_number(source, default = 0) ⇒ Numeric
source を Numeric に変換する.
-
._en_pair(trunk, branch = nil) ⇒ trunk自体, When::Coordinates::Pair
branch が有効なら (source, branch) を When::Coordinates::Pair に変換する。.
-
._en_pair_array(source) ⇒ Array<When::Coordinates::Pair>
文字列を When::Coordinates::Pair のArray 化する.
-
._en_pair_date_time(source) ⇒ Array<When::Coordinates::Pair>
日付を When::Coordinates::Pair のArray 化する.
-
._force_pair(source, branch = nil) ⇒ When::Coordinates::Pair
(source, branch) を When::Coordinates::Pair に変換する.
-
._format(format, list) ⇒ String
branch文字を意識して、書式文字列により When::Coordinates::Pair の Array を文字列化.
Instance Method Summary collapse
-
#%(other) ⇒ When::Coordinates::Pair
剰余.
-
#*(other) ⇒ Numeric
@trunk, @branch を取得する.
-
#+(other) ⇒ When::Coordinates::Pair
加算.
-
#+@ ⇒ Numeric
属性 @sum を取得する.
-
#-(other) ⇒ When::Coordinates::Pair
減算.
-
#-@ ⇒ When::Coordinates::Pair
trunk の符号を反転する.
-
#<=>(other) ⇒ Integer
比較.
-
#_to_hash_value(options = {}) ⇒ String, When::Coordinates::Pair
to_h のための要素生成.
-
#coerce(other) ⇒ Object
強制型変換.
-
#divmod(other) ⇒ When::Coordinates::Pair
商と剰余.
-
#inspect ⇒ String
When::Coordinates::Pair オブジェクトを分かりやすい文字列にして返します.
-
#to_s(zero = '') ⇒ String
文字列化.
Methods inherited from Numeric
#clock, #to_day_of_week, #to_month_name, #to_pair, #unit_duration, #unit_interval_length, #unit_period_duration
Methods included from TM::TemporalPosition::Conversion
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object (private)
その他のメソッド
When::Coordinates:Pair で定義されていないメソッドは
処理を @sum (type:Numeric) に委譲する
1131 1132 1133 1134 1135 1136 1137 1138 |
# File 'lib/when_exe/coordinates.rb', line 1131 def method_missing(name, *args, &block) self.class.module_eval %Q{ def #{name}(*args, &block) @sum.send("#{name}", *args, &block) end } unless When::Parts::MethodCash.escape(name) @sum.send(name, *args, &block) end |
Instance Attribute Details
#branch ⇒ Numeric
暦要素の枝
943 944 945 |
# File 'lib/when_exe/coordinates.rb', line 943 def branch @branch end |
#sum ⇒ Numeric (readonly)
個別の実装において、本変数が When::TM::Calendar や When::TM::Clock が扱うべき 座標値を表すように配慮されている。
例: 会計年度など年の変わり目が暦年と異なる場合、trunk+=1, branch-=1 として、
trunk が会計年度, sum が暦年を表現するようにできる。この場合、trunk は表記上の
年、branch は会計年度と暦年にずれがあるという情報を表現していることになる。
暦要素の幹と枝の和
958 959 960 |
# File 'lib/when_exe/coordinates.rb', line 958 def sum @sum end |
#trunk ⇒ Numeric
暦要素の幹
936 937 938 |
# File 'lib/when_exe/coordinates.rb', line 936 def trunk @trunk end |
Class Method Details
._de_pair(source) ⇒ Numeric+
When::Coordinates::Pair の trunk と branch の和をとって Numeric 化する
850 851 852 853 854 855 856 857 858 859 860 861 |
# File 'lib/when_exe/coordinates.rb', line 850 def _de_pair(source) case source when Array return (source.map!{|v| _de_pair(v)}) when self return source.sum when Numeric return source else raise TypeError, "Irregal type for #{self}" end end |
._en_number(source, default = 0) ⇒ Numeric
source を Numeric に変換する
792 793 794 795 796 797 |
# File 'lib/when_exe/coordinates.rb', line 792 def _en_number(source, default=0) return default unless(source) integer = source.to_i float = source.to_f return (integer==float) ? integer : float end |
._en_pair(trunk, branch = nil) ⇒ trunk自体, When::Coordinates::Pair
branch が有効なら (source, branch) を When::Coordinates::Pair に変換する。
833 834 835 836 837 838 839 |
# File 'lib/when_exe/coordinates.rb', line 833 def _en_pair(trunk, branch=nil) return trunk if (trunk.kind_of?(self)) branch = DL0[branch] || DL1[branch] || branch trunk = _en_number(trunk) if (trunk) return trunk unless (branch && branch != 0) return new(trunk, branch) end |
._en_pair_array(source) ⇒ Array<When::Coordinates::Pair>
文字列を When::Coordinates::Pair のArray 化する
870 871 872 873 874 875 876 |
# File 'lib/when_exe/coordinates.rb', line 870 def _en_pair_array(source) source = $1 if source=~/\A\s*\[?(.+?)\]?\s*\z/ source.split(/,/).map {|v| v =~ /\A\s*(.+?)([^\d\s])?\s*\z/ _en_pair($1, $2) } end |
._en_pair_date_time(source) ⇒ Array<When::Coordinates::Pair>
日付を When::Coordinates::Pair のArray 化する
885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 |
# File 'lib/when_exe/coordinates.rb', line 885 def _en_pair_date_time(source) source = $1 if source =~ /\A\s*\[(.+)\]\s*\z/ trunk, branch, *rest = source.strip.split(/([^\d])/) if trunk == '' sign = branch trunk, branch, *rest = rest trunk = sign + trunk if trunk end pairs = [] while (trunk) pairs << _en_pair(trunk, branch) trunk, branch, *rest = rest end return pairs end |
._force_pair(source, branch = nil) ⇒ When::Coordinates::Pair
(source, branch) を When::Coordinates::Pair に変換する
807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 |
# File 'lib/when_exe/coordinates.rb', line 807 def _force_pair(source, branch=nil) case source when self return source when Numeric return new(_en_number(source), branch) when String tail = source[-1..-1] branch = DL0[tail] || DL1[tail] source = (branch) ? source[0..-2] : source.dup trunk = (source =~ /\.|E/i) ? source.to_f : source.to_i return new(trunk, branch) else raise TypeError, "Irregal type for #{self} :#{source}" end end |
._format(format, list) ⇒ String
%0s は文字列引数の表示を抑制するための指定となる。C言語のprintfと異なるので注意。
branch文字を意識して、書式文字列により When::Coordinates::Pair の Array を文字列化
912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 |
# File 'lib/when_exe/coordinates.rb', line 912 def _format(m17ns) index = 1 m17ns[0].scan(/(%(?:(\d)\$)?[-+0# ]?[*\d.$]*[cspdiuboxXfgeEG])([-.:])?|(%%|.)/).inject('') { |form, m17n| t,i,s,c = m17n case t when '%0s' m17n[index..index] = nil when nil form += c else suffix = DL2[m17ns[i ? i.to_i : index]*0] || s if s form += t + ({nil=>'', '%'=>'%%'}[suffix] || suffix) index += t.length - t.gsub(/\*/,'').length + 1 end form } % m17ns[1..-1].map { |v| v.kind_of?(self) ? v.trunk : v } end |
Instance Method Details
#%(other) ⇒ When::Coordinates::Pair
剰余
1073 1074 1075 |
# File 'lib/when_exe/coordinates.rb', line 1073 def %(other) self.class.new(@trunk % other, @branch) end |
#*(other) ⇒ Numeric
When::Coordinates::Pair 以外の Numeric では、1 による乗算は恒等変換になる。 また、0 による乗算は恒に 0になる。 このため、When::TM::Calendar や When::TM::Clock の実装は、暦要素が When::Coordinates::Pair か 否かを判断することなく、暦要素に 1 による乗算を施すことによって、trunk に相当する値を、 0 による乗算を施すことによって、branch に相当する値を取得できる。
@trunk, @branch を取得する
1021 1022 1023 1024 1025 1026 1027 1028 |
# File 'lib/when_exe/coordinates.rb', line 1021 def *(other) case other when 1 ; @trunk when 0 ; @branch when -1 ; -@trunk else ; raise ArgumentError, "Irregal designation : #{other}" end end |
#+(other) ⇒ When::Coordinates::Pair
加算
1037 1038 1039 1040 |
# File 'lib/when_exe/coordinates.rb', line 1037 def +(other) return self.class.new(@trunk + other, @branch) unless other.kind_of?(self.class) return self.class.new(@trunk + other.trunk, @branch + other.branch) end |
#+@ ⇒ Numeric
When::Coordinates::Pair 以外の Numeric では、単項演算 + は恒等変換になる。 このため、When::TM::Calendar や When::TM::Clock の実装は、暦要素が When::Coordinates::Pair か 否かを判断することなく、暦要素に単項演算 + を施すことによって、必要な暦要素を取得できる。
属性 @sum を取得する
994 995 996 |
# File 'lib/when_exe/coordinates.rb', line 994 def +@ return @sum end |
#-(other) ⇒ When::Coordinates::Pair
減算
1049 1050 1051 1052 |
# File 'lib/when_exe/coordinates.rb', line 1049 def -(other) return self.class.new(@trunk - other, @branch) unless other.kind_of?(self.class) return self.class.new(@trunk - other.trunk, @branch - other.branch) end |
#-@ ⇒ When::Coordinates::Pair
trunk の符号を反転する
1002 1003 1004 |
# File 'lib/when_exe/coordinates.rb', line 1002 def -@ return self.class.new(-@trunk, @branch) end |
#<=>(other) ⇒ Integer
比較
1084 1085 1086 1087 |
# File 'lib/when_exe/coordinates.rb', line 1084 def <=>(other) other = self.class._force_pair(other) (@trunk <=> other.trunk).nonzero? || (@branch <=> other.branch) end |
#_to_hash_value(options = {}) ⇒ String, When::Coordinates::Pair
to_h のための要素生成
155 156 157 |
# File 'lib/when_exe/inspect.rb', line 155 def _to_hash_value(={}) [:method] == :to_m17n ? to_s : self end |
#coerce(other) ⇒ Object
強制型変換
1101 1102 1103 |
# File 'lib/when_exe/coordinates.rb', line 1101 def coerce(other) [self.class._force_pair(other), self] end |
#divmod(other) ⇒ When::Coordinates::Pair
商と剰余
1061 1062 1063 1064 |
# File 'lib/when_exe/coordinates.rb', line 1061 def divmod(other) div, mod = @trunk.divmod(other) return div, self.class.new(mod, @branch) end |
#inspect ⇒ String
When::Coordinates::Pair オブジェクトを分かりやすい文字列にして返します
163 164 165 |
# File 'lib/when_exe/inspect.rb', line 163 def inspect When::EncodingConversion.to_external_encoding(to_s) end |