diff --git a/src/libstd/str.rs b/src/libstd/str.rs index cbd1e47b29b..c616689d966 100644 --- a/src/libstd/str.rs +++ b/src/libstd/str.rs @@ -23,7 +23,7 @@ use char::Char; use clone::Clone; use container::{Container, Mutable}; use iter::Times; -use iterator::{Iterator, IteratorUtil, FilterIterator, AdditiveIterator, MapIterator}; +use iterator::{Iterator, FromIterator, IteratorUtil, FilterIterator, AdditiveIterator, MapIterator}; use libc; use num::Zero; use option::{None, Option, Some}; @@ -2319,6 +2319,18 @@ impl<'self> Iterator for BytesRevIterator<'self> { } } +impl> FromIterator for ~str { + #[inline] + fn from_iterator(iterator: &mut T) -> ~str { + let (lower, _) = iterator.size_hint(); + let mut buf = with_capacity(lower); + for iterator.advance |ch| { + buf.push_char(ch) + } + buf + } +} + // This works because every lifetime is a sub-lifetime of 'static impl<'self> Zero for &'self str { fn zero() -> &'self str { "" } @@ -2482,6 +2494,16 @@ mod tests { assert_eq!(~"华ประเทศไทย中", data); } + #[test] + fn test_collect() { + let empty = ""; + let s: ~str = empty.iter().collect(); + assert_eq!(empty, s.as_slice()); + let data = "ประเทศไทย中"; + let s: ~str = data.iter().collect(); + assert_eq!(data, s.as_slice()); + } + #[test] fn test_clear() { let mut empty = ~"";