summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-03-20 02:23:11 +0900
committerGitHub <[email protected]>2017-03-20 02:23:11 +0900
commit631de65e0ce400b4041fe8fb826f150adf86f446 (patch)
tree48783d911a6a2d1bc995e860bcad8e6c624697c5
parentdcf6a413cab097e39d2d883d7c8c297d29ea43b8 (diff)
parent7a74a617ea8ba8deba22a22263f4188419d8d02d (diff)
downloadmruby-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.rb45
-rw-r--r--test/t/string.rb5
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