Struct str::Str [] [src]

pub struct Str { /* fields omitted */ }

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.

Methods

impl Str
[src]

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();

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');

Returns this Str's capacity, in bytes.

Examples

Basic usage:

use str::Str;

let s = Str::with_capacity(10);

assert!(s.capacity() >= 10);

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());

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());

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());

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();

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 to capacity.
  • 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);

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[..]);

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[..]);

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);

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[..]);

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);

Trait Implementations

impl Clone for Str
[src]

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

impl Eq for Str
[src]

impl Ord for Str
[src]

This method returns an Ordering between self and other. Read more

🔬 This is a nightly-only experimental API. (ord_max_min)

Compares and returns the maximum of two values. Read more

🔬 This is a nightly-only experimental API. (ord_max_min)

Compares and returns the minimum of two values. Read more

impl<'a> From<&'a str> for Str
[src]

Performs the conversion.

impl From<String> for Str
[src]

Performs the conversion.

impl From<Vec<char>> for Str
[src]

Performs the conversion.

impl<'a> From<&'a [char]> for Str
[src]

Performs the conversion.

impl<'a> From<&'a mut [char]> for Str
[src]

Performs the conversion.

impl Into<String> for Str
[src]

Performs the conversion.

impl<'a> Into<String> for &'a Str
[src]

Performs the conversion.

impl Default for Str
[src]

Returns the "default value" for a type. Read more

impl IntoIterator for Str
[src]

The type of the elements being iterated over.

Which kind of iterator are we turning this into?

Creates an iterator from a value. Read more

impl AsRef<Str> for Str
[src]

Performs the conversion.

impl AsMut<Str> for Str
[src]

Performs the conversion.

impl AsRef<[char]> for Str
[src]

Performs the conversion.

impl AsMut<[char]> for Str
[src]

Performs the conversion.

impl Add for Str
[src]

The resulting type after applying the + operator

The method for the + operator

impl Add<char> for Str
[src]

The resulting type after applying the + operator

The method for the + operator

impl<'a> Add<&'a str> for Str
[src]

The resulting type after applying the + operator

The method for the + operator

impl AddAssign for Str
[src]

The method for the += operator

impl AddAssign<char> for Str
[src]

The method for the += operator

impl<'a> AddAssign<&'a str> for Str
[src]

The method for the += operator

impl PartialEq for Str
[src]

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

impl PartialOrd for Str
[src]

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

impl Index<usize> for Str
[src]

The returned type after indexing

The method for the indexing (container[index]) operation

impl Index<Range<usize>> for Str
[src]

The returned type after indexing

The method for the indexing (container[index]) operation

impl Index<RangeFrom<usize>> for Str
[src]

The returned type after indexing

The method for the indexing (container[index]) operation

impl Index<RangeTo<usize>> for Str
[src]

The returned type after indexing

The method for the indexing (container[index]) operation

impl Index<RangeFull> for Str
[src]

The returned type after indexing

The method for the indexing (container[index]) operation

impl IndexMut<usize> for Str
[src]

The method for the mutable indexing (container[index]) operation

impl IndexMut<Range<usize>> for Str
[src]

The method for the mutable indexing (container[index]) operation

impl IndexMut<RangeFrom<usize>> for Str
[src]

The method for the mutable indexing (container[index]) operation

impl IndexMut<RangeTo<usize>> for Str
[src]

The method for the mutable indexing (container[index]) operation

impl IndexMut<RangeFull> for Str
[src]

The method for the mutable indexing (container[index]) operation

impl Display for Str
[src]

Formats the value using the given formatter. Read more

impl Debug for Str
[src]

Formats the value using the given formatter.