Day 6:String 與 &str 的關係
學習目標
- 分清
String(擁有)與 &str(借用)
- 熟練兩者轉換
- 明白該何時用哪一種
今日重點
String vs &str
|
String |
&str |
| 所有權 |
擁有資料 |
借用資料 |
| 可變 |
可變 |
不可變 |
| 生命週期 |
獨立 |
綁定來源 |
| 例子 |
String::from("hi") |
"hi", &str |
轉換
// &str -> String
let s: String = "hello".to_string();
let s: String = String::from("hello");
// String -> &str
let s = String::from("hello");
let slice: &str = &s;
當參數:用 &str 最彈性
fn greet(name: &str) {
println!("Hello, {}!", name);
}
fn main() {
greet("Alice"); // 直接丟字面值
let s = String::from("Bob");
greet(&s); // &String 自動轉 &str
}
拼接
let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = format!("{}{}", s1, s2); // 最通用
String + &str:s1 + &s2 會 move 掉 s1,用 format! 較安全。
練習
fn main() {
let words = vec!["apple", "orange", "banana"];
// 1. 把 words join 成 "apple, orange, banana"
// 2. 寫函式,接受 &str,回傳它的字元和
fn char_sum(s: &str) -> usize { s.chars().count() }
let s = String::from("héllo");
println!("{}", char_sum(&s)); // 注意 Unicode 字元數
}
自我檢查
深入連結
- The Book 第 8 章「Storing UTF-8 Encoded Text with Strings」