From 2b7222d3ececbdc9840a3d7bd34f6cca905b80ad Mon Sep 17 00:00:00 2001 From: Ulrik Sverdrup Date: Sat, 24 Sep 2016 19:35:24 +0200 Subject: [PATCH] Add method str::repeat(self, usize) -> String MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is relatively simple to repeat a string n times: `(0..n).map(|_| s).collect::()`. It becomes slightly more complicated to do it “right” (sizing the allocation up front), which warrants a method that does it for us. This method is useful in writing testcases, or when generating text. `format!()` can be used to repeat single characters, but not repeating strings like this. --- src/libcollections/str.rs | 20 ++++++++++++++++++++ src/libcollectionstest/lib.rs | 1 + src/libcollectionstest/str.rs | 7 +++++++ 3 files changed, 28 insertions(+) diff --git a/src/libcollections/str.rs b/src/libcollections/str.rs index 999c84ba70538..eb3cbf59aa4f5 100644 --- a/src/libcollections/str.rs +++ b/src/libcollections/str.rs @@ -1746,4 +1746,24 @@ impl str { String::from_utf8_unchecked(slice.into_vec()) } } + + /// Create a [`String`] by repeating a string `n` times. + /// + /// [`String`]: string/struct.String.html + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// #![feature(repeat_str)] + /// + /// assert_eq!("abc".repeat(4), String::from("abcabcabcabc")); + /// ``` + #[unstable(feature = "repeat_str", issue = "37079")] + pub fn repeat(&self, n: usize) -> String { + let mut s = String::with_capacity(self.len() * n); + s.extend((0..n).map(|_| self)); + s + } } diff --git a/src/libcollectionstest/lib.rs b/src/libcollectionstest/lib.rs index 32a07e3e7e621..ac5a1217b4999 100644 --- a/src/libcollectionstest/lib.rs +++ b/src/libcollectionstest/lib.rs @@ -19,6 +19,7 @@ #![feature(enumset)] #![feature(pattern)] #![feature(rand)] +#![feature(repeat_str)] #![feature(step_by)] #![feature(str_escape)] #![feature(test)] diff --git a/src/libcollectionstest/str.rs b/src/libcollectionstest/str.rs index a61925cd3be5a..ebf3b01765155 100644 --- a/src/libcollectionstest/str.rs +++ b/src/libcollectionstest/str.rs @@ -1272,6 +1272,13 @@ fn test_cow_from() { } } +#[test] +fn test_repeat() { + assert_eq!("".repeat(3), ""); + assert_eq!("abc".repeat(0), ""); + assert_eq!("α".repeat(3), "ααα"); +} + mod pattern { use std::str::pattern::Pattern; use std::str::pattern::{Searcher, ReverseSearcher};