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) に委譲する
1145 1146 1147 1148 1149 1150 1151 1152 |
# File 'lib/when_exe/coordinates.rb', line 1145 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
暦要素の枝
957 958 959 |
# File 'lib/when_exe/coordinates.rb', line 957 def branch @branch end |
#sum ⇒ Numeric (readonly)
個別の実装において、本変数が When::TM::Calendar や When::TM::Clock が扱うべき 座標値を表すように配慮されている。
例: 会計年度など年の変わり目が暦年と異なる場合、trunk+=1, branch-=1 として、
trunk が会計年度, sum が暦年を表現するようにできる。この場合、trunk は表記上の
年、branch は会計年度と暦年にずれがあるという情報を表現していることになる。
暦要素の幹と枝の和
972 973 974 |
# File 'lib/when_exe/coordinates.rb', line 972 def sum @sum end |
#trunk ⇒ Numeric
暦要素の幹
950 951 952 |
# File 'lib/when_exe/coordinates.rb', line 950 def trunk @trunk end |
Class Method Details
._de_pair(source) ⇒ Numeric+
When::Coordinates::Pair の trunk と branch の和をとって Numeric 化する
864 865 866 867 868 869 870 871 872 873 874 875 |
# File 'lib/when_exe/coordinates.rb', line 864 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 に変換する
806 807 808 809 810 811 |
# File 'lib/when_exe/coordinates.rb', line 806 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 に変換する。
847 848 849 850 851 852 853 |
# File 'lib/when_exe/coordinates.rb', line 847 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 化する
884 885 886 887 888 889 890 |
# File 'lib/when_exe/coordinates.rb', line 884 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 化する
899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 |
# File 'lib/when_exe/coordinates.rb', line 899 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 に変換する
821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 |
# File 'lib/when_exe/coordinates.rb', line 821 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 を文字列化
926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 |
# File 'lib/when_exe/coordinates.rb', line 926 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
剰余
1087 1088 1089 |
# File 'lib/when_exe/coordinates.rb', line 1087 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 を取得する
1035 1036 1037 1038 1039 1040 1041 1042 |
# File 'lib/when_exe/coordinates.rb', line 1035 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
加算
1051 1052 1053 1054 |
# File 'lib/when_exe/coordinates.rb', line 1051 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 を取得する
1008 1009 1010 |
# File 'lib/when_exe/coordinates.rb', line 1008 def +@ return @sum end |
#-(other) ⇒ When::Coordinates::Pair
減算
1063 1064 1065 1066 |
# File 'lib/when_exe/coordinates.rb', line 1063 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 の符号を反転する
1016 1017 1018 |
# File 'lib/when_exe/coordinates.rb', line 1016 def -@ return self.class.new(-@trunk, @branch) end |
#<=>(other) ⇒ Integer
比較
1098 1099 1100 1101 |
# File 'lib/when_exe/coordinates.rb', line 1098 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 のための要素生成
174 175 176 |
# File 'lib/when_exe/inspect.rb', line 174 def _to_hash_value(={}) [:method] == :to_m17n ? to_s : self end |
#coerce(other) ⇒ Object
強制型変換
1115 1116 1117 |
# File 'lib/when_exe/coordinates.rb', line 1115 def coerce(other) [self.class._force_pair(other), self] end |
#divmod(other) ⇒ When::Coordinates::Pair
商と剰余
1075 1076 1077 1078 |
# File 'lib/when_exe/coordinates.rb', line 1075 def divmod(other) div, mod = @trunk.divmod(other) return div, self.class.new(mod, @branch) end |
#inspect ⇒ String
When::Coordinates::Pair オブジェクトを分かりやすい文字列にして返します
182 183 184 |
# File 'lib/when_exe/inspect.rb', line 182 def inspect When::EncodingConversion.to_external_encoding(to_s) end |