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
40
At 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
25
Here, 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.
Str
s 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
ptr
needs to have been previously allocated by the same allocator the standard library uses. length
needs to be less than or equal tocapacity
.capacity
needs 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