diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-03-20 02:23:11 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-03-20 02:23:11 +0900 |
| commit | 631de65e0ce400b4041fe8fb826f150adf86f446 (patch) | |
| tree | 48783d911a6a2d1bc995e860bcad8e6c624697c5 | |
| parent | dcf6a413cab097e39d2d883d7c8c297d29ea43b8 (diff) | |
| parent | 7a74a617ea8ba8deba22a22263f4188419d8d02d (diff) | |
| download | mruby-631de65e0ce400b4041fe8fb826f150adf86f446.tar.gz mruby-631de65e0ce400b4041fe8fb826f150adf86f446.zip | |
Merge pull request #3527 from ksss/string-gsub
Update String#gsub and String#gsub!
| -rw-r--r-- | mrblib/string.rb | 45 | ||||
| -rw-r--r-- | test/t/string.rb | 5 |
2 files changed, 31 insertions, 19 deletions
diff --git a/mrblib/string.rb b/mrblib/string.rb index 6e55ee341..26dbdcb9c 100644 --- a/mrblib/string.rb +++ b/mrblib/string.rb @@ -58,28 +58,34 @@ class String # # ISO 15.2.10.5.18 def gsub(*args, &block) - if args.size == 2 - pattern, replace = *args - plen = pattern.length + return to_enum(:gsub, *args) if args.length == 1 && !block + raise ArgumentError, "wrong number of arguments" unless (1..2).include?(args.length) + + pattern, replace = *args + plen = pattern.length + if args.length == 2 && block + block = nil + end + if !replace.nil? || !block replace = replace.to_str - offset = 0 - result = [] - while found = index(pattern, offset) - result << self[offset, found - offset] - offset = found + plen - result << replace.__sub_replace(self[0, found], pattern, self[offset..-1] || "") - if plen == 0 - result << self[offset, 1] - offset += 1 - end + end + offset = 0 + result = [] + while found = index(pattern, offset) + result << self[offset, found - offset] + offset = found + plen + result << if block + block.call(pattern).to_s + else + replace.__sub_replace(self[0, found], pattern, self[offset..-1] || "") + end + if plen == 0 + result << self[offset, 1] + offset += 1 end - result << self[offset..-1] if offset < length - result.join - elsif args.size == 1 && block - split(args[0], -1).join(block.call(args[0])) - else - raise ArgumentError, "wrong number of arguments" end + result << self[offset..-1] if offset < length + result.join end ## @@ -91,6 +97,7 @@ class String # ISO 15.2.10.5.19 def gsub!(*args, &block) raise RuntimeError, "can't modify frozen String" if frozen? + return to_enum(:gsub!, *args) if args.length == 1 && !block str = self.gsub(*args, &block) return nil if str == self self.replace(str) diff --git a/test/t/string.rb b/test/t/string.rb index ddc74fa54..c99457d7e 100644 --- a/test/t/string.rb +++ b/test/t/string.rb @@ -373,6 +373,11 @@ assert('String#gsub', '15.2.10.5.18') do assert_equal('A', 'a'.gsub('a'){|w| w.capitalize }) assert_equal("<a><><>", 'a'.gsub('a', '<\0><\1><\2>')) assert_equal(".h.e.l.l.o.", "hello".gsub("", ".")) + a = [] + assert_equal(".h.e.l.l.o.", "hello".gsub("") { |i| a << i; "." }) + assert_equal(["", "", "", "", "", ""], a) + assert_raise(ArgumentError) { "".gsub } + assert_raise(ArgumentError) { "".gsub("", "", "") } end assert('String#gsub with backslash') do |
