DEV Community

Dsysd Dev
Dsysd Dev

Posted on

String vs str in Rust: Understanding the Fundamental Differences for Efficient Programming

Instead, the string data type in Rust is represented by the "String" type (with an uppercase 'S'). The confusion might arise because of the "str" type (with a lowercase 's'), which is used as a string slice in Rust.


String

The String type in Rust is a growable, heap-allocated, UTF-8 encoded string.

It is part of the Rust standard library and is widely used when you need a mutable and dynamic string that can be modified and resized at runtime. 

You can create a new String by calling its associated function String::new() or by converting from a string slice using the to_string() method.

let mut my_string = String::new();
my_string.push_str("Hello, ");
my_string.push('R');
my_string.push('u');
my_string.push('s');
my_string.push('t');

println!("{}", my_string); // Output: "Hello, Rust"
Enter fullscreen mode Exit fullscreen mode

str (String Slice)

The str type in Rust is a borrowed string slice, also known as a string reference.

It represents a view into an existing UTF-8 encoded string data. String slices are immutable and have a fixed size that cannot be modified.

String slices are commonly used to pass string data without transferring ownership, reducing the need for unnecessary memory copies.

fn print_greeting(greeting: &str) {
    println!("{}", greeting);
}

let my_string = "Hello, Rust!";
print_greeting(my_string); // Output: "Hello, Rust!"
Enter fullscreen mode Exit fullscreen mode

Differences between "String" and "str" (String Slice)

Ownership:

String owns the data it represents and is responsible for its memory allocation and deallocation.

str (String Slice) is a borrowed reference to a portion of an existing string or string literal, and it does not own the data.

Mutability:

String is mutable, meaning you can modify its content after creation.

str (String Slice) is immutable, and you cannot modify its content.

Size:

String can dynamically grow or shrink as needed and has a flexible size.

str (String Slice) has a fixed size and represents a subset of a larger string data.

Allocation:

String is heap-allocated, and its memory is managed by the Rust standard library.

str (String Slice) does not require any heap allocation and is often used as borrowed references to string literals or other String types.

But what is a view

When we say that a "str" (String Slice) represents a view into an existing UTF-8 encoded string data, it means that the "str" type does not own the actual string data.

Instead, it provides a read-only reference to a portion of an existing UTF-8 encoded string.

Let's break it down

View

A "view" in this context means that the str type acts as a window or a lens through which you can observe a part of a larger string.

It allows you to look at and interact with that specific section of the string without actually copying or owning the entire string data.

Existing UTF-8 Encoded String Data

The data referred to by a str must already exist somewhere in memory.

It could be a string literal (a sequence of characters enclosed in double quotes) or a part of a heap-allocated "String" type.

In either case, the string data must be UTF-8 encoded, as Rust enforces UTF-8 encoding for all its string types.

UTF-8 Encoded

UTF-8 is a character encoding standard that represents characters in a way that ensures compatibility with the ASCII character set while also supporting a vast range of international characters.

Rust's str type enforces UTF-8 encoding to guarantee that strings can represent any valid Unicode text.

Here's an example to illustrate the concept:

fn main() {
    let my_string = String::from("Hello, Rust!"); // A heap-allocated String
    let my_slice: &str = &my_string[0..5]; // A string slice representing "Hello"

    println!("Original String: {}", my_string);
    println!("String Slice: {}", my_slice);
}
Enter fullscreen mode Exit fullscreen mode

In this example, we have a heap-allocated String called my_string, containing the text "Hello, Rust!".

The line let my_slice: &str = &my_string[0..5]; creates a string slice my_slice that borrows a part of my_string, specifically the characters from index 0 to 4 ("Hello").

The string slice my_slice does not own the data; it simply provides a view into the existing string data held by my_string.

The use of string slices allows Rust to efficiently work with and manipulate parts of strings without incurring unnecessary memory copies, making it a memory-safe and high-performance language for string handling.

Summary

In summary, "String" is a dynamic and mutable string type that owns its data, while "str" (String Slice) is an immutable reference to a fixed portion of a string and does not own the data.

Both types are essential in Rust and serve different purposes depending on the use case and requirements of your code.

Claps Please!

If you found this article helpful I would appreciate some claps 👏👏👏👏, it motivates me to write more such useful articles in the future.

Follow for regular awesome content and insights.

Subscribe to my Newsletter

If you like my content, then consider subscribing to my free newsletter, to get exclusive, educational, technical, interesting and career related content directly delivered to your inbox

https://dsysd.beehiiv.com/subscribe

Important Links

Thanks for reading the post, be sure to follow the links below for even more awesome content in the future.

Twitter: https://twitter.com/dsysd_dev
Youtube: https://www.youtube.com/@dsysd-dev
Github: https://github.com/dsysd-dev
Medium: https://medium.com/@dsysd-dev
Email: dsysd.mail@gmail.com
Telegram 📚: https://t.me/dsysd_dev_channel
Linkedin: https://www.linkedin.com/in/dsysd-dev/
Newsletter: https://dsysd.beehiiv.com/subscribe
Gumroad: https://dsysd.gumroad.com/
Dev.to: https://dev.to/dsysd_dev/

Top comments (1)

Collapse
 
franzqafqa profile image
Aveen

👏👏👏