pub struct Str { /* private fields */ }Expand description
A UTF-8 encoded, growable string.
The Str type is string type that has owership over the char.
§Example
You can create a Str from a literal string with Str::from:
use str::Str;
let hello = Str::from("hello, world!");You can append a char to a Str with the push method, and
append a &str with the push_str method;
use str::Str;
let mut hello = Str::from("Hello, ");
hello.push('w');
hello.push_str("orld!");If you have a String, you can create a Str from it with the
from method, and you can convert Str to String whit the
into method:
use str::Str;
let hello = String::from("Hello world!");
let world = Str::from(hello);
let hello_world: String = world.into();§Representation
A Str is made up of three components: a pointer to some chars, a
length, and a capacity. The pointer points to an internal buffer Str
uses to store its data. The length is the munber of bytes currently
stored in the buffer, and the capacity is the size of the buffer in
chars. As such, the length will always be less than or equal to the
capacity.
The buffer is always stored on the heap.
You can look at these with the as_ptr, len, and capacity
methods:
use std::mem;
use str::Str;
let story = Str::from("Once upon a time...");
let ptr = story.as_ptr();
let len = story.len();
let capacity = story.capacity();
// story has nineteen chars
assert_eq!(19, len);
// Now that we have our parts, we throw the story away.
mem::forget(story);
// We can re-build a Str out of ptr, len, and capacity. This is all
// unsafe because we are responsible for making sure the components
// valid:
let s = unsafe { Str::from_raw_parts(ptr as *mut _, len, capacity) };
assert_eq!(Str::from("Once upon a time..."), s);If a Str has enough capacity, adding elements to it will not
re-allocate. For example, consider this program:
use str::Str;
let mut s = Str::new();
println!("{}", s.capacity());
for _ in 0..5 {
s.push_str("hello");
println!("{}", s.capacity());
}This will output the following:
0
5
10
20
20
40At first, we have no memory allocated at all, but as we append to the
string, it increases its capacity appropriately. If we instead use the
with_capacity method to allocate the correct capacity initially:
use str::Str;
let mut s = Str::with_capacity(25);
println!("{}", s.capacity());
for _ in 0..5 {
s.push_str("hello");
println!("{}", s.capacity());
}We end up with a different output:
25
25
25
25
25
25Here, there’s no need to allocate more memory inside the loop.
Implementations§
Source§impl Str
impl Str
Sourcepub fn new() -> Str
pub fn new() -> Str
Creates a new empty Str.
Given that the Str is empty, this will not allocate any initial
buffer. While that means that this initial operation is very
inexpensive, but may cause excessive allocation later, when you add
data. If you have an idea of how much data the Str will hold,
consider the with_capacity method to prevent excessive
re-allocation.
§Examples
Basic usage:
use str::Str;
let s = Str::new();Sourcepub fn with_capacity(capacity: usize) -> Str
pub fn with_capacity(capacity: usize) -> Str
Creates a new empty Str with a particular capacity.
Strs have an internal buffer to hold their data. The capacity is
the length of that buffer, and can be queried with the capacity
method. This method creates an empty Str, but one with an initial
buffer that can hold capacity bytes. This is useful when you may be
appending a bunch of data to the Str, reducing the number of
reallocations it needs to do.
If the given capacity is 0, no allocation will occur, and this method
is identical to the new method.
§Examples
Basic usage:
use str::Str;
let mut s = Str::with_capacity(10);
// The Str contains no chars, even though it has capacity for more
assert_eq!(s.len(), 0);
// These are all done without reallocating...
let cap = s.capacity();
for i in 0..10 {
s.push('a');
}
assert_eq!(s.capacity(), cap);
// ...but this may make the vector reallocate
s.push('a');Sourcepub fn capacity(&self) -> usize
pub fn capacity(&self) -> usize
Returns this Str’s capacity, in bytes.
§Examples
Basic usage:
use str::Str;
let s = Str::with_capacity(10);
assert!(s.capacity() >= 10);Sourcepub fn reserve(&mut self, additional: usize)
pub fn reserve(&mut self, additional: usize)
Ensures that this Str’s capacity is at least additional bytes
larger than its length.
The capacity may be increased by more than additional bytes if it
chooses, to prevent frequent reallocations.
If you do not want this “at least” behavior, see the reserve_exact
method.
§Panics
Panics if the new capacity overflows usize.
§Examples
Basic usage:
use str::Str;
let mut s = Str::new();
s.reserve(10);
assert!(s.capacity() >= 10);This may not actually increase the capacity:
use str::Str;
let mut s = Str::with_capacity(10);
s.push('a');
s.push('b');
// s now has a length of 2 and a capacity of 10
assert_eq!(2, s.len());
assert_eq!(10, s.capacity());
// Since we already have an extra 8 capacity, calling this...
s.reserve(8);
// ... doesn't actually increase.
assert_eq!(10, s.capacity());Sourcepub fn reserve_exact(&mut self, additional: usize)
pub fn reserve_exact(&mut self, additional: usize)
Ensures that this Str’s capacity is additional bytes
larger than its length.
Consider using the reserve method unless you absolutely know
better than the allocator.
§Panics
Panics if the new capacity overflows usize.
§Examples
Basic usage:
use str::Str;
let mut s = Str::new();
s.reserve_exact(10);
assert!(s.capacity() >= 10);This may not actually increase the capacity:
use str::Str;
let mut s = Str::with_capacity(10);
s.push('a');
s.push('b');
// s now has a length of 2 and a capacity of 10
assert_eq!(2, s.len());
assert_eq!(10, s.capacity());
// Since we already have an extra 8 capacity, calling this...
s.reserve_exact(8);
// ... doesn't actually increase.
assert_eq!(10, s.capacity());Sourcepub fn shrink_to_fit(&mut self)
pub fn shrink_to_fit(&mut self)
Shrinks the capacity of this Str to match its length.
§Examples
Basic usage:
use str::Str;
let mut s = Str::from("foo");
s.reserve(100);
assert!(s.capacity() >= 100);
s.shrink_to_fit();
assert_eq!(3, s.capacity());Sourcepub fn as_ptr(&self) -> *const char
pub fn as_ptr(&self) -> *const char
Converts a Str to a raw pointer.
As Str are a vector of chars, the raw pointer points to a char.
This pointer will be pointing to the first byte of the Str.
§Examples
Basic usage:
use str::Str;
let s = Str::from("Hello");
let ptr = s.as_ptr();Sourcepub unsafe fn from_raw_parts(
buf: *mut char,
length: usize,
capacity: usize,
) -> Str
pub unsafe fn from_raw_parts( buf: *mut char, length: usize, capacity: usize, ) -> Str
Creates a new Str from a length, capacity, and pointer.
§Safety
This is highly unsafe, due to the number of invariants that aren’t checked:
- The memory at
ptrneeds to have been previously allocated by the same allocator the standard library uses. lengthneeds to be less than or equal tocapacity.capacityneeds to be the correct value.
Violating these may cause problems like corrupting the allocator’s internal datastructures.
The ownership of ptr is effectively transferred to the
Str which may then deallocate, reallocate or change the
contents of memory pointed to by the pointer at will. Ensure
that nothing else uses the pointer after calling this
function.
§Examples
Basic usage:
use std::mem;
use str::Str;
let s = Str::from("hello");
let ptr = s.as_ptr();
let len = s.len();
let capacity = s.capacity();
mem::forget(s);
let s = unsafe { Str::from_raw_parts(ptr as *mut _, len, capacity) };
assert_eq!(Str::from("hello"), s);Sourcepub fn as_bytes(&self) -> Vec<u8> ⓘ
pub fn as_bytes(&self) -> Vec<u8> ⓘ
Converts a Str into a byte vector.
§Examples
Basic usage:
use str::Str;
let s = Str::from("hello");
let bytes = s.as_bytes();
assert_eq!(&[104, 101, 108, 108, 111], &bytes[..]);Sourcepub fn as_slice(&self) -> &[char]
pub fn as_slice(&self) -> &[char]
Converts a Str into a char slice.
This consumes the Str, so we do not need to copy its contents.
§Examples
Basic usage:
use str::Str;
let s = Str::from("hello");
let bytes = s.as_slice();
assert_eq!(&['h', 'e', 'l', 'l', 'o'][..], &bytes[..]);Sourcepub fn as_mut_slice(&mut self) -> &mut [char]
pub fn as_mut_slice(&mut self) -> &mut [char]
Converts a Str into a mut char slice.
This consumes the Str, so we do not need to copy its contents.
§Examples
Basic usage:
use str::Str;
let mut s = Str::from("hello");
{
let bytes = s.as_mut_slice();
bytes[1] = 'a';
}
assert_eq!(Str::from("hallo"), s);Sourcepub fn as_vec(self) -> Vec<char>
pub fn as_vec(self) -> Vec<char>
Converts a Str into a char vector.
This consumes the Str, so we do not need to copy its contents.
§Examples
Basic usage:
use str::Str;
let s = Str::from("hello");
let bytes = s.as_vec();
assert_eq!(&['h', 'e', 'l', 'l', 'o'], &bytes[..]);Sourcepub fn as_mut_vec(&mut self) -> &mut Vec<char>
pub fn as_mut_vec(&mut self) -> &mut Vec<char>
Converts a Str into a mut char slice.
This consumes the Str, so we do not need to copy its contents.
§Examples
Basic usage:
use str::Str;
let mut s = Str::from("hello");
{
let bytes = s.as_mut_vec();
bytes[1] = 'a';
}
assert_eq!(Str::from("hallo"), s);pub fn retain<F>(&mut self, f: F)
pub fn get(&self, idx: usize) -> Option<&char>
pub fn get_mut(&mut self, idx: usize) -> Option<&mut char>
pub fn truncate(&mut self, new_len: usize)
pub fn push(&mut self, ch: char)
pub fn push_str(&mut self, string: &str)
pub fn pop(&mut self) -> Option<char>
pub fn remove(&mut self, idx: usize) -> char
pub fn insert(&mut self, idx: usize, ch: char)
pub fn insert_str(&mut self, _idx: usize, _string: &str)
pub fn append(&mut self, other: &mut Self)
pub fn len(&self) -> usize
pub fn is_empty(&self) -> bool
pub fn split_off(&mut self, at: usize) -> Str
pub fn split_at(&self, mid: usize) -> (Str, Str)
pub fn clear(&mut self)
pub fn iter(self) -> StrIterator ⓘ
Trait Implementations§
Source§impl<'a> AddAssign<&'a str> for Str
impl<'a> AddAssign<&'a str> for Str
Source§fn add_assign(&mut self, other: &str)
fn add_assign(&mut self, other: &str)
+= operation. Read moreSource§impl AddAssign<char> for Str
impl AddAssign<char> for Str
Source§fn add_assign(&mut self, other: char)
fn add_assign(&mut self, other: char)
+= operation. Read moreSource§impl AddAssign for Str
impl AddAssign for Str
Source§fn add_assign(&mut self, other: Str)
fn add_assign(&mut self, other: Str)
+= operation. Read more