อัปเดตสำหรับ Rust 1.0
คุณไม่สามารถได้รับ&'static strจาก a StringเพราะStrings อาจไม่อยู่ตลอดชีวิตของโปรแกรมของคุณและนั่นคือสิ่งที่&'staticหมายถึงอายุการใช้งาน คุณสามารถรับพารามิเตอร์ slice ตามStringอายุการใช้งานของตัวเองได้จากมันเท่านั้น
ในการเปลี่ยนจาก a Stringเป็นชิ้น&'a strคุณสามารถใช้ไวยากรณ์การแบ่งส่วน:
let s: String = "abcdefg".to_owned();
let s_slice: &str = &s[..];
หรืออีกวิธีหนึ่งคุณสามารถใช้ข้อเท็จจริงที่StringดำเนินการDeref<Target=str>และดำเนินการใหม่อย่างชัดเจน:
let s_slice: &str = &*s;
มีวิธีอื่นที่ช่วยให้สามารถใช้ไวยากรณ์ที่กระชับยิ่งขึ้นได้ แต่จะใช้ได้ก็ต่อเมื่อคอมไพเลอร์สามารถกำหนดประเภทเป้าหมายที่ต้องการได้ (เช่นในอาร์กิวเมนต์ของฟังก์ชันหรือการผูกตัวแปรที่พิมพ์อย่างชัดเจน) เรียกว่าderef coercionและอนุญาตให้ใช้&ตัวดำเนินการเพียงอย่างเดียวและคอมไพเลอร์จะแทรกจำนวน*s ที่เหมาะสมโดยอัตโนมัติตามบริบท:
let s_slice: &str = &s;
fn take_name(name: &str) { ... }
take_name(&s);
let not_correct = &s;
โปรดทราบว่ารูปแบบนี้ไม่ซ้ำกันสำหรับString/ &str- คุณสามารถใช้ได้กับทุกคู่ประเภทที่เชื่อมต่อผ่านDerefเช่นกับCString/ CStrและOsString/ OsStrจากstd::ffiโมดูลหรือPathBuf/ Pathจากstd::pathโมดูล
'staticอายุการใช้งานหมายความว่าสตริงไม่เคยถูกจัดสรรนั่นคือหน่วยความจำรั่วไหล ทำไมคุณถึงต้องการ&'static strแทนที่จะ&'a strเป็นสิ่งที่เหมาะสม'a?