kyanite 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/0 start all Tests.bat +23 -0
- data/History.txt +4 -0
- data/License.txt +21 -0
- data/Manifest.txt +88 -0
- data/PostInstall.txt +4 -0
- data/README.txt +48 -0
- data/Rakefile.rb +79 -0
- data/init.rb +2 -0
- data/lib/kyanite.rb +39 -0
- data/lib/kyanite/array.rb +5 -0
- data/lib/kyanite/array/array.rb +172 -0
- data/lib/kyanite/array/array2.rb +140 -0
- data/lib/kyanite/array/matrix2.rb +120 -0
- data/lib/kyanite/array_of_enumerables.rb +2 -0
- data/lib/kyanite/array_of_numerics.rb +2 -0
- data/lib/kyanite/array_of_strings.rb +2 -0
- data/lib/kyanite/basics.rb +60 -0
- data/lib/kyanite/dictionary.rb +116 -0
- data/lib/kyanite/enumerable.rb +7 -0
- data/lib/kyanite/enumerable/enumerable_enumerables.rb +70 -0
- data/lib/kyanite/enumerable/enumerable_numerics.rb +171 -0
- data/lib/kyanite/enumerable/enumerable_strings.rb +58 -0
- data/lib/kyanite/enumerable/structure.rb +170 -0
- data/lib/kyanite/general.rb +8 -0
- data/lib/kyanite/general/callerutils.rb +128 -0
- data/lib/kyanite/general/classutils.rb +246 -0
- data/lib/kyanite/general/kernel.rb +105 -0
- data/lib/kyanite/general/nil.rb +64 -0
- data/lib/kyanite/general/object.rb +86 -0
- data/lib/kyanite/general/true_false.rb +65 -0
- data/lib/kyanite/general/undoable.rb +24 -0
- data/lib/kyanite/hash.rb +170 -0
- data/lib/kyanite/matrix2.rb +2 -0
- data/lib/kyanite/nil.rb +3 -0
- data/lib/kyanite/numeric.rb +4 -0
- data/lib/kyanite/numeric/float.rb +26 -0
- data/lib/kyanite/numeric/integer.rb +34 -0
- data/lib/kyanite/numeric/numeric.rb +45 -0
- data/lib/kyanite/operation.rb +5 -0
- data/lib/kyanite/operation/call_tracker.rb +69 -0
- data/lib/kyanite/operation/rake.rb +101 -0
- data/lib/kyanite/operation/regexp.rb +23 -0
- data/lib/kyanite/operation/unit_test.rb +53 -0
- data/lib/kyanite/optimizer.rb +119 -0
- data/lib/kyanite/rake.rb +2 -0
- data/lib/kyanite/range.rb +54 -0
- data/lib/kyanite/set.rb +219 -0
- data/lib/kyanite/smart_load_path.rb +2 -0
- data/lib/kyanite/string.rb +13 -0
- data/lib/kyanite/string/cast.rb +104 -0
- data/lib/kyanite/string/chars.rb +184 -0
- data/lib/kyanite/string/chars_const.rb +190 -0
- data/lib/kyanite/string/diff.rb +78 -0
- data/lib/kyanite/string/div.rb +19 -0
- data/lib/kyanite/string/include.rb +43 -0
- data/lib/kyanite/string/list.rb +84 -0
- data/lib/kyanite/string/mgsub.rb +35 -0
- data/lib/kyanite/string/nested.rb +253 -0
- data/lib/kyanite/string/random.rb +69 -0
- data/lib/kyanite/string/split.rb +136 -0
- data/lib/kyanite/symbol.rb +19 -0
- data/lib/kyanite/tree.rb +99 -0
- data/lib/kyanite/undoable.rb +2 -0
- data/lib/kyanite/unit_test.rb +2 -0
- data/test/_start_all.rb +17 -0
- data/test/array/test_array.rb +106 -0
- data/test/array/test_matrix2.rb +162 -0
- data/test/enumerable/test_enumerable_enumerables.rb +46 -0
- data/test/enumerable/test_enumerable_numerics.rb +93 -0
- data/test/enumerable/test_enumerable_strings.rb +22 -0
- data/test/enumerable/test_structure.rb +220 -0
- data/test/general/test_classutils.rb +45 -0
- data/test/general/test_nil.rb +44 -0
- data/test/general/test_object.rb +49 -0
- data/test/general/test_true_false.rb +28 -0
- data/test/numeric/test_numeric_integer.rb +28 -0
- data/test/string/test_cast.rb +108 -0
- data/test/string/test_chars.rb +255 -0
- data/test/string/test_diff.rb +95 -0
- data/test/string/test_list.rb +141 -0
- data/test/string/test_nested.rb +361 -0
- data/test/string/test_split.rb +187 -0
- data/test/test_dictionary.rb +128 -0
- data/test/test_hash.rb +59 -0
- data/test/test_optimizer.rb +150 -0
- data/test/test_range.rb +41 -0
- data/test/test_set.rb +210 -0
- data/test/test_tree.rb +94 -0
- metadata +217 -0
@@ -0,0 +1,190 @@
|
|
1
|
+
|
2
|
+
# Multibyte-Unterstützung von ActiveSupport
|
3
|
+
$KCODE = 'UTF8'
|
4
|
+
require 'active_support'
|
5
|
+
|
6
|
+
require 'facets/dictionary'
|
7
|
+
require 'kyanite/nil'
|
8
|
+
require 'kyanite/string/div'
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
unless defined?(TR_UPCASE_ALL_REGEXP)
|
14
|
+
base = Dictionary.new
|
15
|
+
base['a'] = ' àáâă äãā åạą æ ảấầắằ а '
|
16
|
+
base['A'] = ' ÀÁÂĂ ÄÃĀ ÅẠĄ Æ ẢẤẦẮẰ А '
|
17
|
+
base['b'] = ' б '
|
18
|
+
base['B'] = ' Б '
|
19
|
+
base['c'] = ' ćĉč çċ цч '
|
20
|
+
base['C'] = ' ĆĈČ ÇĊ ЦЧ '
|
21
|
+
base['d'] = ' ď ðđ д '
|
22
|
+
base['D'] = ' Ď ÐĐ Д '
|
23
|
+
base['e'] = ' èéêěĕ ëēėę ế еэ '
|
24
|
+
base['E'] = ' ÈÉÊĚĔ ËĒĖĘ Ế ЕЭ '
|
25
|
+
base['f'] = ' ф '
|
26
|
+
base['F'] = ' Ф '
|
27
|
+
base['g'] = ' ĝğġ ģ г '
|
28
|
+
base['G'] = ' ĜĞĠ Ģ Г '
|
29
|
+
base['h'] = ' ĥħ х '
|
30
|
+
base['H'] = ' ĤĦ Х '
|
31
|
+
base['i'] = ' ìíîĭ ïĩīı į ij ий'
|
32
|
+
base['I'] = ' ÌÍÎĬ ÏĨĪİ Į IJ ИЙ'
|
33
|
+
base['j'] = ' ĵ юя '
|
34
|
+
base['J'] = ' Ĵ ЮЯ '
|
35
|
+
base['k'] = ' ķĸ к '
|
36
|
+
base['K'] = ' Ķĸ К '
|
37
|
+
base['l'] = ' ĺ ľłļŀ л '
|
38
|
+
base['L'] = ' Ĺ ĽŁĻĿ Л '
|
39
|
+
base['m'] = ' м '
|
40
|
+
base['M'] = ' М '
|
41
|
+
base['n'] = ' ńň ñņʼnŋ н '
|
42
|
+
base['N'] = ' ŃŇ ÑŅʼnŊ Н '
|
43
|
+
base['o'] = ' òóôŏ öõō øőơ œ о '
|
44
|
+
base['O'] = ' ÒÓÔŎ ÖÕŌ ØŐƠ Œ О '
|
45
|
+
base['p'] = ' п '
|
46
|
+
base['P'] = ' П '
|
47
|
+
base['q'] = nil
|
48
|
+
base['Q'] = nil
|
49
|
+
base['r'] = ' ŕř ŗ р '
|
50
|
+
base['R'] = ' ŔŘ Ŗ Р '
|
51
|
+
base['s'] = ' śŝš ßş сшщ '
|
52
|
+
base['S'] = ' ŚŜŠ ߪ СШЩ '
|
53
|
+
base['t'] = ' ţťŧþ т '
|
54
|
+
base['T'] = ' ŢŤŦÞ Т '
|
55
|
+
base['u'] = ' ùúûŭ üũū ůűųư у '
|
56
|
+
base['U'] = ' ÙÚÛŬ ÜŨŪ ŮŰŲƯ У '
|
57
|
+
base['v'] = ' в'
|
58
|
+
base['V'] = ' В '
|
59
|
+
base['w'] = ' ŵ '
|
60
|
+
base['W'] = ' Ŵ '
|
61
|
+
base['x'] = nil
|
62
|
+
base['X'] = nil
|
63
|
+
base['y'] = ' ýŷ ÿ '
|
64
|
+
base['Y'] = ' ÝŶ Ÿ '
|
65
|
+
base['z'] = ' źżž жз '
|
66
|
+
base['Z'] = ' ŹŻŽ ЖЗ '
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
allkeys = 'abcdefghijklmnopqrstuvwxyz'
|
73
|
+
#allkeys = 'snk'
|
74
|
+
|
75
|
+
# Spaces entfernen
|
76
|
+
allkeys.split(//).each do |key|
|
77
|
+
next unless base[key]
|
78
|
+
base[key].strip!.gsub!(' ','').gsub!(' ','')
|
79
|
+
base[key.upcase].strip!.gsub!(' ','').gsub!(' ','')
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
# upcase und downcase
|
84
|
+
tr_upcase = ''
|
85
|
+
tr_downcase = ''
|
86
|
+
allkeys.split(//).each do |key|
|
87
|
+
next unless base[key]
|
88
|
+
tr_downcase += base[key]
|
89
|
+
tr_upcase += base[key.upcase]
|
90
|
+
end
|
91
|
+
|
92
|
+
tr_upcase2 = ''
|
93
|
+
tr_downcase2 = ''
|
94
|
+
tr_downcase_only = ''
|
95
|
+
tr_upcase.mb_chars.split(//).each_with_index do |c, i|
|
96
|
+
if c == tr_downcase.mb_chars[i..i]
|
97
|
+
tr_downcase_only += c
|
98
|
+
else
|
99
|
+
tr_upcase2 += c
|
100
|
+
tr_downcase2 += tr_downcase.mb_chars[i..i]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
TR_DOWNCASE_ONLY = tr_downcase_only
|
105
|
+
|
106
|
+
|
107
|
+
# reduce alphabet
|
108
|
+
tr_full = ''
|
109
|
+
tr_reduced = ''
|
110
|
+
allkeys.split(//).each do |key|
|
111
|
+
next unless base[key]
|
112
|
+
tr_full += base[key]
|
113
|
+
# tr_reduced += key * base[key].jsize
|
114
|
+
tr_reduced += key * base[key].mb_chars.size
|
115
|
+
tr_full += base[key.upcase]
|
116
|
+
# tr_reduced += key.upcase * base[key.upcase].jsize
|
117
|
+
tr_reduced += key.upcase * base[key.upcase].mb_chars.size
|
118
|
+
end
|
119
|
+
|
120
|
+
tr_full2 = ''
|
121
|
+
tr_reduced2 = ''
|
122
|
+
tr_full.mb_chars.split(//).each_with_index do |c, i|
|
123
|
+
next if ( TR_DOWNCASE_ONLY.include?(c) &&
|
124
|
+
(tr_reduced[i..i] == tr_reduced[i..i].upcase) )
|
125
|
+
tr_full2 += c
|
126
|
+
tr_reduced2 += tr_reduced[i..i]
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
TR_UPCASE = tr_upcase2
|
131
|
+
TR_DOWNCASE = tr_downcase2
|
132
|
+
TR_FULL = tr_full2
|
133
|
+
TR_REDUCED = tr_reduced2
|
134
|
+
TR_UPCASE_ALL_REGEXP = /^[A-ZÀÁÂĂÄÃĀÅẠĄÆẢẤẦẮẰАБĆĈČÇĊЦЧĎÐĐДÈÉÊĚĔËĒĖĘẾЕЭФĜĞĠĢГĤĦХÌÍÎĬÏĨĪİĮIJИЙĴЮЯĶКĹĽŁĻĿЛМŃŇÑŅŊНÒÓÔŎÖÕŌØŐƠŒОПŔŘŖРŚŜŠŞСШЩŢŤŦÞТÙÚÛŬÜŨŪŮŰŲƯУВŴÝŶŸŹŻŽЖЗ]/
|
135
|
+
|
136
|
+
end # unless defined?
|
137
|
+
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
# -----------------------------------------------------------------------------------------
|
144
|
+
# Ausprobieren
|
145
|
+
#
|
146
|
+
if $0 == __FILE__ then
|
147
|
+
|
148
|
+
require 'perception'
|
149
|
+
rawlog "\n----------------------------------------------------------\n\n"
|
150
|
+
|
151
|
+
rawlog 'TR_DOWNCASE_ONLY= '
|
152
|
+
rawlog TR_DOWNCASE_ONLY
|
153
|
+
rawlog "\n"
|
154
|
+
|
155
|
+
rawlog 'TR_FULL= '
|
156
|
+
rawlog TR_FULL
|
157
|
+
rawlog "\n"
|
158
|
+
rawlog 'TR_REDUCED= '
|
159
|
+
rawlog TR_REDUCED
|
160
|
+
rawlog "\n"
|
161
|
+
|
162
|
+
rawlog 'TR_UPCASE= '
|
163
|
+
rawlog TR_UPCASE
|
164
|
+
rawlog "\n"
|
165
|
+
rawlog 'TR_DOWNCASE= '
|
166
|
+
rawlog TR_DOWNCASE
|
167
|
+
rawlog "\n"
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
|
188
|
+
|
189
|
+
|
190
|
+
|
@@ -0,0 +1,78 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
class String
|
5
|
+
|
6
|
+
|
7
|
+
# ---------------------------------------------------------------------------------------------------------------------------------
|
8
|
+
# :section: overlap / diff
|
9
|
+
#
|
10
|
+
|
11
|
+
# Gibt den gemeinsamen Teil zweier Strings aus (von vorne gezählt).
|
12
|
+
#
|
13
|
+
# Beispiele & Tests siehe TestString#test_overlap
|
14
|
+
def overlap(b)
|
15
|
+
return '' if b.nil?
|
16
|
+
b = b.to_str
|
17
|
+
return self if self == b
|
18
|
+
return '' if self[0] != b[0]
|
19
|
+
|
20
|
+
n = [self.size, b.size].min
|
21
|
+
(0..n).each { |i| return self[0..i-1] unless self[i] == b[i] }
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
# Liefert den Unterschied zwischen zwei Strings zurück.
|
26
|
+
# Im Zweifelsfall immer den längsten String.
|
27
|
+
# Wenn dann immer noch Zweifel, dann self.
|
28
|
+
#
|
29
|
+
# Beispiele & Tests siehe TestString#test_diff
|
30
|
+
def diff(b)
|
31
|
+
return self if b.nil?
|
32
|
+
b = b.to_str
|
33
|
+
return '' if self == b # kein Unterschied
|
34
|
+
|
35
|
+
a = self
|
36
|
+
a,b = b,a if a.size >= b.size # a ist jetzt k�rzer oder gleichlang wie b
|
37
|
+
overlap = a.overlap(b)
|
38
|
+
return self if overlap == ''
|
39
|
+
return b.split(overlap)[1]
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
# Liefert zugleich overlap und diff zurück.
|
45
|
+
# Symmetrie: Rechnet man overlap + diff, so erhält man immer den längsten der beiden ursprünglichen Strings.
|
46
|
+
# Waren beide gleichlang, so erhält man self.
|
47
|
+
# overlapdiff braucht genauso viel Zeit wie diff alleine.
|
48
|
+
#
|
49
|
+
# Beispiele & Tests siehe TestString#test_overlapdiff
|
50
|
+
def overlapdiff(b)
|
51
|
+
return '', self if b.nil?
|
52
|
+
b = b.to_str
|
53
|
+
return self,'' if self == b # kein Unterschied
|
54
|
+
|
55
|
+
a = self
|
56
|
+
a,b = b,a if a.size >= b.size # a ist jetzt k�rzer oder gleichlang wie b
|
57
|
+
overlap = a.overlap(b)
|
58
|
+
return overlap, self if overlap == ''
|
59
|
+
return overlap, b.split(overlap)[1]
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
class NilClass
|
69
|
+
def overlap(*a); ''; end
|
70
|
+
def diff(b); b; end
|
71
|
+
def overlapdiff(b); ['', b]; end
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
|
2
|
+
class String
|
3
|
+
alias :old_include? :include?
|
4
|
+
|
5
|
+
# Nimmt jetzt auch ein Array an.
|
6
|
+
# Die Array-Elemente werden ODER-verknüpft, d.h.
|
7
|
+
# include? ist true, wenn für mindestens eines der Elemente include? true ist.
|
8
|
+
# Alle Strings includen '', [] oder nil.
|
9
|
+
# Andersherum enthält nil niemals irgendwas (nil.include? => false)
|
10
|
+
def include?(input)
|
11
|
+
return true if input.nil?
|
12
|
+
return true if input.empty?
|
13
|
+
if ( input.respond_to?(:each) && !input.kind_of?(String) )
|
14
|
+
input.each do |frag|
|
15
|
+
return true if include?(frag)
|
16
|
+
end
|
17
|
+
false
|
18
|
+
else
|
19
|
+
old_include?(input)
|
20
|
+
end
|
21
|
+
end # def
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
class NilClass
|
26
|
+
def include?(*a); false; end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
# -----------------------------------------------------------------------------------------
|
31
|
+
# ausprobieren
|
32
|
+
#
|
33
|
+
if $0 == __FILE__ then
|
34
|
+
|
35
|
+
# puts 'hallo'.include?('ll')
|
36
|
+
# puts 'hallo'.include?('lh')
|
37
|
+
#puts 'hallo'.include?(['gg'])
|
38
|
+
#puts 'hallo'.include?(['lh','gg'])
|
39
|
+
puts 'hallo'.include?('')
|
40
|
+
puts 'hallo'.include?(nil)
|
41
|
+
puts nil.include?(nil)
|
42
|
+
|
43
|
+
end # if
|
@@ -0,0 +1,84 @@
|
|
1
|
+
|
2
|
+
require 'kyanite/nil'
|
3
|
+
require 'kyanite/symbol'
|
4
|
+
|
5
|
+
class String
|
6
|
+
|
7
|
+
# ---------------------------------------------------------------------------------------------------------------------------------
|
8
|
+
# :section: Listen / Datenbank
|
9
|
+
#
|
10
|
+
|
11
|
+
|
12
|
+
# Listet Text auf. Beispiele siehe Tests!
|
13
|
+
def list_with( elemente, options = {}, &block )
|
14
|
+
|
15
|
+
options = { :pre => %q{'},
|
16
|
+
:post => %q{'},
|
17
|
+
:sep => ' OR ',
|
18
|
+
:empty => 'FALSE'}.merge(options)
|
19
|
+
|
20
|
+
|
21
|
+
# keine Liste angegeben
|
22
|
+
return options[:empty] if elemente.empty?
|
23
|
+
|
24
|
+
|
25
|
+
# einzelnen String oder einzelnes Symbol angegeben -> ohne Separator ausgeben
|
26
|
+
if elemente.kind_of?(String) || !elemente.respond_to?(:each_index)
|
27
|
+
e = elemente.dup
|
28
|
+
e = yield e if block_given?
|
29
|
+
return "#{self}#{options[:pre]}#{e}#{options[:post]}"
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
# Liste hat nur ein Element -> ohne Separator ausgeben
|
34
|
+
if elemente.size <= 1
|
35
|
+
e = elemente[0].dup
|
36
|
+
e = yield e if block_given?
|
37
|
+
return "#{self}#{options[:pre]}#{e}#{options[:post]}"
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
# Liste hat mehrere Elemente
|
42
|
+
result = ''
|
43
|
+
elemente[0..-2].each do |e|
|
44
|
+
# Die vorderen Elemente mit Separator
|
45
|
+
e = yield e if block_given?
|
46
|
+
result += "#{self}#{options[:pre]}#{e}#{options[:post]}#{options[:sep]}"
|
47
|
+
end
|
48
|
+
# Letztes Element ohne Separator
|
49
|
+
e = elemente[-1].dup
|
50
|
+
e = yield elemente[-1] if block_given?
|
51
|
+
result += "#{self}#{options[:pre]}#{e}#{options[:post]}"
|
52
|
+
result
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
# Gibt eine SQL-RegExp zurück, mit der man in Postgres kommaseparierte Listen duchsuchen kann.
|
58
|
+
# Anwendung: Model Merkmal, has_many :dienste_req
|
59
|
+
#
|
60
|
+
def sql_regexp_for_kommaliste
|
61
|
+
'[, ]' + self + '[, ]' + '|' + # match mittendrin
|
62
|
+
'^' + self + '[, ]' + '|' + # match am Anfang
|
63
|
+
'[, ]' + self + '$' + '|' + # match am Ende
|
64
|
+
'^' + self + '$' # match von Anfang bis Ende
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
# macht aus einer MySQL-Enum-Angabe ein Array
|
69
|
+
#
|
70
|
+
def enum_to_array
|
71
|
+
self[5..-2].gsub("'",'').split(',').collect {|i| [i,i] }
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
class NilClass
|
80
|
+
def list_with(*a); nil; end
|
81
|
+
def sql_regexp_for_kommaliste; nil; end
|
82
|
+
def enum_to_array; nil; end
|
83
|
+
end
|
84
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
class String
|
3
|
+
|
4
|
+
# Mehrere Patterns mit einer RegExp replacen.
|
5
|
+
# Ruby Cookbook Seite 32
|
6
|
+
# "between".mgsub([[/ee/, 'AA'], [/e/, 'E']]) # Good code
|
7
|
+
# => "bEtwAAn"
|
8
|
+
#
|
9
|
+
def mgsub(key_value_pairs=[].freeze)
|
10
|
+
regexp_fragments = key_value_pairs.collect { |k,v| k }
|
11
|
+
gsub(Regexp.union(*regexp_fragments)) do |match|
|
12
|
+
key_value_pairs.detect{|k,v| k =~ match}[1]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
# http://oreilly.com/catalog/9780596523695/
|
16
|
+
# Ruby Cookbook, by Lucas Carlson and Leonard Richardson
|
17
|
+
# Copyright 2006 O'Reilly Media
|
18
|
+
|
19
|
+
end # class
|
20
|
+
|
21
|
+
|
22
|
+
class NilClass
|
23
|
+
def mgsub(*a); nil; end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
# -----------------------------------------------------------------------------------------
|
29
|
+
# ausprobieren
|
30
|
+
#
|
31
|
+
if $0 == __FILE__ then
|
32
|
+
|
33
|
+
puts "between".mgsub([[/ee/, 'AA'], [/e/, 'E']])
|
34
|
+
|
35
|
+
end # if
|