blackwinter-ruby-nuggets 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. data/COPYING +676 -0
  2. data/ChangeLog +5 -0
  3. data/README +60 -0
  4. data/Rakefile +20 -0
  5. data/lib/nuggets/all.rb +34 -0
  6. data/lib/nuggets/array/combination.rb +86 -0
  7. data/lib/nuggets/array/flatten_once.rb +68 -0
  8. data/lib/nuggets/array/format.rb +124 -0
  9. data/lib/nuggets/array/in_order.rb +62 -0
  10. data/lib/nuggets/array/monotone.rb +101 -0
  11. data/lib/nuggets/array/only.rb +56 -0
  12. data/lib/nuggets/array/rand.rb +45 -0
  13. data/lib/nuggets/array/shuffle.rb +133 -0
  14. data/lib/nuggets/array/to_hash.rb +86 -0
  15. data/lib/nuggets/enumerable/agrep.rb +82 -0
  16. data/lib/nuggets/enumerable/all_any_extended.rb +99 -0
  17. data/lib/nuggets/enumerable/minmax.rb +119 -0
  18. data/lib/nuggets/env/user_encoding.rb +53 -0
  19. data/lib/nuggets/env/user_home.rb +54 -0
  20. data/lib/nuggets/file/which.rb +74 -0
  21. data/lib/nuggets/hash/at.rb +87 -0
  22. data/lib/nuggets/hash/in_order.rb +52 -0
  23. data/lib/nuggets/hash/insert.rb +65 -0
  24. data/lib/nuggets/hash/only.rb +68 -0
  25. data/lib/nuggets/integer/factorial.rb +74 -0
  26. data/lib/nuggets/integer/to_binary_s.rb +47 -0
  27. data/lib/nuggets/io/agrep.rb +43 -0
  28. data/lib/nuggets/io/modes.rb +133 -0
  29. data/lib/nuggets/numeric/between.rb +2 -0
  30. data/lib/nuggets/numeric/duration.rb +109 -0
  31. data/lib/nuggets/numeric/limit.rb +70 -0
  32. data/lib/nuggets/numeric/signum.rb +60 -0
  33. data/lib/nuggets/numeric/to_multiple.rb +68 -0
  34. data/lib/nuggets/object/blank.rb +119 -0
  35. data/lib/nuggets/object/boolean.rb +69 -0
  36. data/lib/nuggets/object/eigenclass.rb +2 -0
  37. data/lib/nuggets/object/ghost_class.rb +2 -0
  38. data/lib/nuggets/object/metaclass.rb +2 -0
  39. data/lib/nuggets/object/msend.rb +55 -0
  40. data/lib/nuggets/object/singleton_class.rb +150 -0
  41. data/lib/nuggets/object/uniclass.rb +2 -0
  42. data/lib/nuggets/object/virtual_class.rb +2 -0
  43. data/lib/nuggets/proc/bind.rb +68 -0
  44. data/lib/nuggets/string/capitalize_first.rb +63 -0
  45. data/lib/nuggets/string/case.rb +104 -0
  46. data/lib/nuggets/string/evaluate.rb +53 -0
  47. data/lib/nuggets/string/msub.rb +82 -0
  48. data/lib/nuggets/string/nsub.rb +80 -0
  49. data/lib/nuggets/string/sub_with_md.rb +131 -0
  50. data/lib/nuggets/string/word_wrap.rb +111 -0
  51. data/lib/nuggets/tempfile/open.rb +54 -0
  52. data/lib/nuggets/uri/content_type.rb +65 -0
  53. data/lib/nuggets/uri/exist.rb +63 -0
  54. data/lib/nuggets/util/added_methods/init.rb +3 -0
  55. data/lib/nuggets/util/added_methods.rb +407 -0
  56. data/lib/nuggets/util/ansicolor2css.rb +90 -0
  57. data/lib/nuggets/util/content_type.rb +104 -0
  58. data/lib/nuggets/util/dotted_decimal.rb +66 -0
  59. data/lib/nuggets/util/i18n.rb +143 -0
  60. data/lib/nuggets/version.rb +27 -0
  61. data/lib/nuggets.rb +73 -0
  62. metadata +124 -0
@@ -0,0 +1,150 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # A component of ruby-nuggets, some extensions to the Ruby programming #
5
+ # language. #
6
+ # #
7
+ # Copyright (C) 2007-2008 Jens Wille #
8
+ # #
9
+ # Authors: #
10
+ # Jens Wille <jens.wille@uni-koeln.de> #
11
+ # #
12
+ # ruby-nuggets is free software; you can redistribute it and/or modify it #
13
+ # under the terms of the GNU General Public License as published by the Free #
14
+ # Software Foundation; either version 3 of the License, or (at your option) #
15
+ # any later version. #
16
+ # #
17
+ # ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
18
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
19
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
20
+ # more details. #
21
+ # #
22
+ # You should have received a copy of the GNU General Public License along #
23
+ # with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
24
+ # #
25
+ ###############################################################################
26
+ #++
27
+
28
+ class Object
29
+
30
+ # call-seq:
31
+ # object.singleton_class => aClass
32
+ #
33
+ # Returns the singleton (or virtual/eigen/meta) class associated with _object_.
34
+ def singleton_class
35
+ class << self; self; end
36
+ end
37
+
38
+ alias_method :virtual_class, :singleton_class
39
+ alias_method :ghost_class, :singleton_class
40
+ alias_method :eigenclass, :singleton_class
41
+ alias_method :metaclass, :singleton_class
42
+ alias_method :uniclass, :singleton_class
43
+
44
+ # call-seq:
45
+ # object.singleton_object => anObject
46
+ #
47
+ # Returns the object of which _object_ is the singleton_class.
48
+ # Raises a TypeError if _object_ is not a singleton class.
49
+ def singleton_object
50
+ [true, false, nil].each { |obj|
51
+ return obj if self.equal?(obj.singleton_class)
52
+ }
53
+
54
+ # raises TypeError if neither class nor module
55
+ ObjectSpace.each_object(self) { |obj|
56
+ return obj if self.equal?(obj.singleton_class)
57
+ }
58
+
59
+ # if we got here, it can't be a singleton class
60
+ # or its singleton object doesn't exist anymore
61
+ raise TypeError
62
+ rescue TypeError
63
+ raise TypeError, 'not a singleton class'
64
+ end
65
+
66
+ alias_method :virtual_object, :singleton_object
67
+ alias_method :ghost_object, :singleton_object
68
+ alias_method :eigenobject, :singleton_object
69
+ alias_method :metaobject, :singleton_object
70
+ alias_method :uniobject, :singleton_object
71
+
72
+ # call-seq:
73
+ # object.singleton_class? => true or false
74
+ #
75
+ # Returns true if _object_ is a singleton_class
76
+ # (i.e., has a singleton_object), false otherwise.
77
+ def singleton_class?
78
+ singleton_object
79
+ true
80
+ rescue TypeError
81
+ false
82
+ end
83
+
84
+ alias_method :virtual_class?, :singleton_class?
85
+ alias_method :ghost_class?, :singleton_class?
86
+ alias_method :eigenclass?, :singleton_class?
87
+ alias_method :metaclass?, :singleton_class?
88
+ alias_method :uniclass?, :singleton_class?
89
+
90
+ end
91
+
92
+ if $0 == __FILE__
93
+ o = Object.new
94
+ p o
95
+ p o.singleton_class?
96
+
97
+ begin
98
+ p o.singleton_object
99
+ rescue TypeError => err
100
+ warn err
101
+ end
102
+
103
+ s = o.singleton_class
104
+ p s
105
+ p s.singleton_class?
106
+ p s.singleton_object
107
+
108
+ ###
109
+
110
+ o = [1, 2]
111
+ p o
112
+
113
+ s = o.singleton_class
114
+ p s
115
+ p s.singleton_class?
116
+ p s.singleton_object
117
+
118
+ ###
119
+
120
+ p Class.new.singleton_class?
121
+ p Class.singleton_class?
122
+
123
+ ###
124
+
125
+ c = Class.new
126
+ o = c.new
127
+ p o
128
+ p c.singleton_class?
129
+
130
+ ###
131
+
132
+ p nil.singleton_class
133
+ p NilClass.singleton_class?
134
+ p NilClass.singleton_object
135
+
136
+ ###
137
+
138
+ class A # :nodoc:
139
+ end
140
+ class B < A # :nodoc:
141
+ end
142
+
143
+ a = A.singleton_class
144
+ b = B.singleton_class
145
+
146
+ p a
147
+ p a.singleton_object #=> A
148
+ p b
149
+ p b.singleton_object #=> B
150
+ end
@@ -0,0 +1,2 @@
1
+ # whatever you prefer to call it...
2
+ require 'nuggets/singleton_class'
@@ -0,0 +1,2 @@
1
+ # whatever you prefer to call it...
2
+ require 'nuggets/singleton_class'
@@ -0,0 +1,68 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # A component of ruby-nuggets, some extensions to the Ruby programming #
5
+ # language. #
6
+ # #
7
+ # Copyright (C) 2007-2008 Jens Wille #
8
+ # #
9
+ # Authors: #
10
+ # Jens Wille <jens.wille@uni-koeln.de> #
11
+ # #
12
+ # ruby-nuggets is free software; you can redistribute it and/or modify it #
13
+ # under the terms of the GNU General Public License as published by the Free #
14
+ # Software Foundation; either version 3 of the License, or (at your option) #
15
+ # any later version. #
16
+ # #
17
+ # ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
18
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
19
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
20
+ # more details. #
21
+ # #
22
+ # You should have received a copy of the GNU General Public License along #
23
+ # with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
24
+ # #
25
+ ###############################################################################
26
+ #++
27
+
28
+ class Proc
29
+
30
+ # call-seq:
31
+ # proc.bind(object) => aMethod
32
+ #
33
+ # Straight from Rails' ActiveSupport -- effectively binds _proc_ to +object+.
34
+ def bind(object)
35
+ block, time = self, Time.now
36
+
37
+ (class << object; self; end).class_eval {
38
+ method_name = "__bind_#{time.to_i}_#{time.usec}"
39
+ define_method(method_name, &block)
40
+
41
+ method = instance_method(method_name)
42
+ remove_method(method_name)
43
+
44
+ method
45
+ }.bind(object)
46
+ end
47
+
48
+ end
49
+
50
+ if $0 == __FILE__
51
+ l = lambda { bla }
52
+
53
+ begin
54
+ l.call
55
+ rescue NameError => err
56
+ puts "#{err} (#{err.class})"
57
+ end
58
+
59
+ module Bla # :nodoc:
60
+
61
+ def self.bla
62
+ puts 'blub'
63
+ end
64
+
65
+ end
66
+
67
+ l.bind(Bla).call
68
+ end
@@ -0,0 +1,63 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # A component of ruby-nuggets, some extensions to the Ruby programming #
5
+ # language. #
6
+ # #
7
+ # Copyright (C) 2007-2008 Jens Wille #
8
+ # #
9
+ # Authors: #
10
+ # Jens Wille <jens.wille@uni-koeln.de> #
11
+ # #
12
+ # ruby-nuggets is free software; you can redistribute it and/or modify it #
13
+ # under the terms of the GNU General Public License as published by the Free #
14
+ # Software Foundation; either version 3 of the License, or (at your option) #
15
+ # any later version. #
16
+ # #
17
+ # ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
18
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
19
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
20
+ # more details. #
21
+ # #
22
+ # You should have received a copy of the GNU General Public License along #
23
+ # with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
24
+ # #
25
+ ###############################################################################
26
+ #++
27
+
28
+ class String
29
+
30
+ # call-seq:
31
+ # str.capitalize_first => new_string
32
+ #
33
+ # Capitalizes the first character in +str+, but without downcasing the rest
34
+ # like String#capitalize does.
35
+ def capitalize_first
36
+ return self if empty?
37
+ self[0..0].upcase << self[1..-1]
38
+ end
39
+
40
+ # call-seq:
41
+ # str.capitalize_first! => str
42
+ #
43
+ # Destructive version of #capitalize_first.
44
+ def capitalize_first!
45
+ replace capitalize_first
46
+ end
47
+
48
+ end
49
+
50
+ if $0 == __FILE__
51
+ s = 'Some string'
52
+ p s
53
+ p s.capitalize_first
54
+
55
+ s = 'some string'
56
+ p s
57
+ p s.capitalize_first
58
+
59
+ s = 'SOME STRING'
60
+ p s
61
+ p s.capitalize
62
+ p s.capitalize_first
63
+ end
@@ -0,0 +1,104 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # A component of ruby-nuggets, some extensions to the Ruby programming #
5
+ # language. #
6
+ # #
7
+ # Copyright (C) 2007 Jens Wille #
8
+ # #
9
+ # Authors: #
10
+ # Jens Wille <jens.wille@uni-koeln.de> #
11
+ # #
12
+ # ruby-nuggets is free software; you can redistribute it and/or modify it #
13
+ # under the terms of the GNU General Public License as published by the Free #
14
+ # Software Foundation; either version 3 of the License, or (at your option) #
15
+ # any later version. #
16
+ # #
17
+ # ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
18
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
19
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
20
+ # more details. #
21
+ # #
22
+ # You should have received a copy of the GNU General Public License along #
23
+ # with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
24
+ # #
25
+ ###############################################################################
26
+ #++
27
+
28
+ class String
29
+
30
+ module Case
31
+
32
+ LOWER = :lower
33
+ UPPER = :upper
34
+ MIXED = :mixed
35
+
36
+ end
37
+
38
+ # call-seq:
39
+ # str.case => aSymbol
40
+ #
41
+ # Returns a symbol indicating the case of _str_.
42
+ def case
43
+ self == downcase ? Case::LOWER :
44
+ self == upcase ? Case::UPPER :
45
+ Case::MIXED
46
+ end
47
+
48
+ # call-seq:
49
+ # str.lower_case? => true or false
50
+ #
51
+ # Tell whether _str_ is all lower case.
52
+ def lower_case?
53
+ self.case == Case::LOWER
54
+ end
55
+ alias_method :downcase?, :lower_case?
56
+
57
+ # call-seq:
58
+ # str.upper_case? => true or false
59
+ #
60
+ # Tell whether _str_ is all upper case.
61
+ def upper_case?
62
+ self.case == Case::UPPER
63
+ end
64
+ alias_method :upcase?, :upper_case?
65
+
66
+ # call-seq:
67
+ # str.mixed_case? => true or false
68
+ #
69
+ # Tell whether _str_ is mixed case.
70
+ def mixed_case?
71
+ self.case == Case::MIXED
72
+ end
73
+
74
+ # call-seq:
75
+ # str.capitalized? => true or false
76
+ #
77
+ # Tell whether _str_ is capitalized.
78
+ def capitalized?
79
+ self == capitalize
80
+ end
81
+
82
+ end
83
+
84
+ if $0 == __FILE__
85
+ s = 'Some string'
86
+ puts s
87
+ p s.case
88
+ puts s.downcase?
89
+ puts s.upcase?
90
+ puts s.mixed_case?
91
+ puts s.capitalized?
92
+
93
+ s = 'some string'
94
+ puts s
95
+ p s.case
96
+ puts s.downcase?
97
+ puts s.mixed_case?
98
+
99
+ s = 'SOME STRING'
100
+ puts s
101
+ p s.case
102
+ puts s.upcase?
103
+ puts s.mixed_case?
104
+ end
@@ -0,0 +1,53 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # A component of ruby-nuggets, some extensions to the Ruby programming #
5
+ # language. #
6
+ # #
7
+ # Copyright (C) 2007 Jens Wille #
8
+ # #
9
+ # Authors: #
10
+ # Jens Wille <jens.wille@uni-koeln.de> #
11
+ # #
12
+ # ruby-nuggets is free software; you can redistribute it and/or modify it #
13
+ # under the terms of the GNU General Public License as published by the Free #
14
+ # Software Foundation; either version 3 of the License, or (at your option) #
15
+ # any later version. #
16
+ # #
17
+ # ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
18
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
19
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
20
+ # more details. #
21
+ # #
22
+ # You should have received a copy of the GNU General Public License along #
23
+ # with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
24
+ # #
25
+ ###############################################################################
26
+ #++
27
+
28
+ class String
29
+
30
+ # call-seq:
31
+ # str.evaluate(binding = TOPLEVEL_BINDING) => new_str
32
+ #
33
+ # Basically turns Kernel#eval into an instance method of String -- inspired
34
+ # by Ruby Cookbook example 1.3. This allows to pre-populate strings with
35
+ # substitution expressions ("#{...}") that can get evaluated in a different
36
+ # environment (= +binding+) at a later point.
37
+ def evaluate(binding = TOPLEVEL_BINDING)
38
+ eval(%Q{"#{self}"}, binding)
39
+ end
40
+
41
+ end
42
+
43
+ if $0 == __FILE__
44
+ s = 'bl#{a}blub'
45
+ p s
46
+
47
+ def foo(bar) # :nodoc:
48
+ a = 'ub'
49
+ bar.evaluate(binding)
50
+ end
51
+
52
+ p foo(s)
53
+ end
@@ -0,0 +1,82 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # A component of ruby-nuggets, some extensions to the Ruby programming #
5
+ # language. #
6
+ # #
7
+ # Copyright (C) 2007 Jens Wille #
8
+ # #
9
+ # Authors: #
10
+ # Jens Wille <jens.wille@uni-koeln.de> #
11
+ # #
12
+ # ruby-nuggets is free software; you can redistribute it and/or modify it #
13
+ # under the terms of the GNU General Public License as published by the Free #
14
+ # Software Foundation; either version 3 of the License, or (at your option) #
15
+ # any later version. #
16
+ # #
17
+ # ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
18
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
19
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
20
+ # more details. #
21
+ # #
22
+ # You should have received a copy of the GNU General Public License along #
23
+ # with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
24
+ # #
25
+ ###############################################################################
26
+ #++
27
+
28
+ require 'nuggets/string/evaluate'
29
+
30
+ class String
31
+
32
+ # call-seq:
33
+ # str.msub(*substitutions) => new_str
34
+ #
35
+ # Performs _multiple_ substitutions on _str_ with order being taken into
36
+ # account (thus results of previous substitutions won't be subject to later
37
+ # ones) -- inspired by Ruby Cookbook example 1.18.
38
+ #
39
+ # The +substitutions+ parameter can be an array or a list of <tt>[pattern,
40
+ # substitution]</tt> pairs, or, simply, a hash. Note that, when using a hash,
41
+ # the ordering of how substitutions are processed might differ from what you
42
+ # intended -- instead use an array when order matters. +pattern+ can be a
43
+ # string or a regexp, +substitution+ may contain string expressions (cf.
44
+ # #evaluate).
45
+ def msub(*substitutions)
46
+ (_dup = dup).msub!(*substitutions) || _dup
47
+ end
48
+
49
+ # call-seq:
50
+ # str.msub!(*substitutions) => str or nil
51
+ #
52
+ # Destructive version of #msub.
53
+ def msub!(*substitutions)
54
+ substitutions = *substitutions # Handle hashes and arrays alike
55
+ keys, subs, cache = [], [], {}
56
+
57
+ substitutions.each { |key, value|
58
+ key = Regexp.new(Regexp.escape(key)) unless key.is_a?(Regexp)
59
+
60
+ keys << key
61
+ subs << [key, value]
62
+ }
63
+
64
+ gsub!(Regexp.union(*keys)) { |match|
65
+ cache[match] ||= subs.find { |key, _|
66
+ key =~ match
67
+ }.last.evaluate(binding)
68
+ }
69
+ end
70
+
71
+ end
72
+
73
+ if $0 == __FILE__
74
+ s = 'Foo, Bar - Baz'
75
+ p s
76
+
77
+ p s.gsub(/a/, 'o').gsub(/o/, 'a')
78
+ p s.msub('a' => 'o', 'o' => 'a')
79
+
80
+ s.msub!('a' => 'o','o' => 'a')
81
+ p s
82
+ end
@@ -0,0 +1,80 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # A component of ruby-nuggets, some extensions to the Ruby programming #
5
+ # language. #
6
+ # #
7
+ # Copyright (C) 2007-2008 Jens Wille #
8
+ # #
9
+ # Authors: #
10
+ # Jens Wille <jens.wille@uni-koeln.de> #
11
+ # #
12
+ # ruby-nuggets is free software; you can redistribute it and/or modify it #
13
+ # under the terms of the GNU General Public License as published by the Free #
14
+ # Software Foundation; either version 3 of the License, or (at your option) #
15
+ # any later version. #
16
+ # #
17
+ # ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
18
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
19
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
20
+ # more details. #
21
+ # #
22
+ # You should have received a copy of the GNU General Public License along #
23
+ # with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
24
+ # #
25
+ ###############################################################################
26
+ #++
27
+
28
+ class String
29
+
30
+ # call-seq:
31
+ # str.nsub(pattern, replacement, count) => new_str
32
+ # str.nsub(pattern, count) { |match| ... } => new_str
33
+ #
34
+ # Returns a copy of _str_ with the _first_ +count+ occurrences of pattern
35
+ # replaced with either +replacement+ or the value of the block.
36
+ def nsub(*args)
37
+ _dup = dup
38
+ (block_given? ?
39
+ _dup.nsub!(*args) { |*a| yield(*a) } :
40
+ _dup.nsub!(*args)) || _dup
41
+ end
42
+
43
+ # call-seq:
44
+ # str.nsub!(pattern, replacement, count) => str or nil
45
+ # str.nsub!(pattern, count) { |match| ... } => str or nil
46
+ #
47
+ # Performs the substitutions of #nsub in place, returning _str_, or +nil+ if
48
+ # no substitutions were performed.
49
+ def nsub!(*args)
50
+ pattern, i = args.first, 0
51
+
52
+ case args.size
53
+ when 2
54
+ # Only +count+ given
55
+ count = args.last
56
+
57
+ gsub!(pattern) { |match| (i += 1) <= count ? yield(match) : match }
58
+ when 3
59
+ # Both +replacement+ and +count+ given;
60
+ # ignore block (just like String#gsub does)
61
+ replacement, count = args.values_at(1, 2)
62
+
63
+ gsub!(pattern) { |match| (i += 1) <= count ? replacement : match }
64
+ else
65
+ raise ArgumentError, "wrong number of arguments (#{args.size} for 2-3)"
66
+ end
67
+ end
68
+
69
+ end
70
+
71
+ if $0 == __FILE__
72
+ s = 'a b c d e f g h i'
73
+ puts s
74
+
75
+ puts s.nsub(' ', '', 6)
76
+ puts s.nsub(' ', 6) { '' }
77
+
78
+ s.nsub!(' ', '', 6)
79
+ puts s
80
+ end