อัปเดตสำหรับ Rust 1.0
คุณไม่สามารถได้รับ&'static str
จาก a String
เพราะString
s อาจไม่อยู่ตลอดชีวิตของโปรแกรมของคุณและนั่นคือสิ่งที่&'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
?