From e7f3d6eddd28a917c9a0f7cd73a489048ca7f4cd Mon Sep 17 00:00:00 2001 From: William Throwe Date: Sun, 1 Nov 2015 00:21:47 -0400 Subject: [PATCH] Let str::replace take a pattern It appears this was left out of RFC #528 because it might be useful to also generalize the second argument in some way. That doesn't seem to prevent generalizing the first argument now, however. This is a [breaking-change] because it could cause type-inference to fail where it previously succeeded. --- src/libcollections/str.rs | 2 +- src/libcollectionstest/str.rs | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/libcollections/str.rs b/src/libcollections/str.rs index be3f93992d9ef..989637517b0e5 100644 --- a/src/libcollections/str.rs +++ b/src/libcollections/str.rs @@ -1706,7 +1706,7 @@ impl str { /// assert_eq!(s, s.replace("cookie monster", "little lamb")); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn replace(&self, from: &str, to: &str) -> String { + pub fn replace<'a, P: Pattern<'a>>(&'a self, from: P, to: &str) -> String { let mut result = String::new(); let mut last_end = 0; for (start, part) in self.match_indices(from) { diff --git a/src/libcollectionstest/str.rs b/src/libcollectionstest/str.rs index e22ff7ca54061..4d84855ddf97f 100644 --- a/src/libcollectionstest/str.rs +++ b/src/libcollectionstest/str.rs @@ -269,6 +269,15 @@ fn test_replace_2d() { assert_eq!(data.replace(d, repl), data); } +#[test] +fn test_replace_pattern() { + let data = "abcdαβγδabcdαβγδ"; + assert_eq!(data.replace("dαβ", "😺😺😺"), "abc😺😺😺γδabc😺😺😺γδ"); + assert_eq!(data.replace('γ', "😺😺😺"), "abcdαβ😺😺😺δabcdαβ😺😺😺δ"); + assert_eq!(data.replace(&['a', 'γ'] as &[_], "😺😺😺"), "😺😺😺bcdαβ😺😺😺δ😺😺😺bcdαβ😺😺😺δ"); + assert_eq!(data.replace(|c| c == 'γ', "😺😺😺"), "abcdαβ😺😺😺δabcdαβ😺😺😺δ"); +} + #[test] fn test_slice() { assert_eq!("ab", &"abc"[0..2]);