about summary refs log tree commit diff
path: root/src/doc/trpl/strings.md
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2015-01-08 10:27:03 -0800
committerAlex Crichton <alex@alexcrichton.com>2015-01-08 10:27:03 -0800
commit7541f82faba6b2839b5e640605d7caab6cc6ec4f (patch)
tree423d2f21a5fd924aa77a1c613ca4faaa79fa7794 /src/doc/trpl/strings.md
parent483fca9fa55d0c1f936412d577424916f20d94a3 (diff)
downloadrust-7541f82faba6b2839b5e640605d7caab6cc6ec4f.tar.gz
rust-7541f82faba6b2839b5e640605d7caab6cc6ec4f.zip
Fix dead links in the guide and reorganize
Diffstat (limited to 'src/doc/trpl/strings.md')
-rw-r--r--src/doc/trpl/strings.md79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/doc/trpl/strings.md b/src/doc/trpl/strings.md
new file mode 100644
index 00000000000..a40e748dae7
--- /dev/null
+++ b/src/doc/trpl/strings.md
@@ -0,0 +1,79 @@
+% Strings
+
+Strings are an important concept for any programmer to master. Rust's string
+handling system is a bit different from other languages, due to its systems
+focus. Any time you have a data structure of variable size, things can get
+tricky, and strings are a re-sizable data structure. That being said, Rust's
+strings also work differently than in some other systems languages, such as C.
+
+Let's dig into the details. A **string** is a sequence of Unicode scalar values
+encoded as a stream of UTF-8 bytes. All strings are guaranteed to be
+validly encoded UTF-8 sequences. Additionally, strings are not null-terminated
+and can contain null bytes.
+
+Rust has two main types of strings: `&str` and `String`.
+
+The first kind is a `&str`. This is pronounced a 'string slice.' String literals
+are of the type `&str`:
+
+```{rust}
+let string = "Hello there."; // string: &str
+```
+
+This string is statically allocated, meaning that it's saved inside our
+compiled program, and exists for the entire duration it runs. The `string`
+binding is a reference to this statically allocated string. String slices
+have a fixed size, and cannot be mutated.
+
+A `String`, on the other hand, is an in-memory string.  This string is
+growable, and is also guaranteed to be UTF-8.
+
+```{rust}
+let mut s = "Hello".to_string(); // mut s: String
+println!("{}", s);
+
+s.push_str(", world.");
+println!("{}", s);
+```
+
+You can get a `&str` view into a `String` with the `as_slice()` method:
+
+```{rust}
+fn takes_slice(slice: &str) {
+    println!("Got: {}", slice);
+}
+
+fn main() {
+    let s = "Hello".to_string();
+    takes_slice(s.as_slice());
+}
+```
+
+To compare a String to a constant string, prefer `as_slice()`...
+
+```{rust}
+fn compare(string: String) {
+    if string.as_slice() == "Hello" {
+        println!("yes");
+    }
+}
+```
+
+... over `to_string()`:
+
+```{rust}
+fn compare(string: String) {
+    if string == "Hello".to_string() {
+        println!("yes");
+    }
+}
+```
+
+Viewing a `String` as a `&str` is cheap, but converting the `&str` to a
+`String` involves allocating memory. No reason to do that unless you have to!
+
+That's the basics of strings in Rust! They're probably a bit more complicated
+than you are used to, if you come from a scripting language, but when the
+low-level details matter, they really matter. Just remember that `String`s
+allocate memory and control their data, while `&str`s are a reference to
+another string, and you'll be all set.