TL; DR: bạn có thể nhận được &'static str
từ String
mà bản thân nó có 'static
thời gian tồn tại.
Mặc dù các câu trả lời khác là đúng và hữu ích nhất, nhưng có một trường hợp cạnh (không hữu ích lắm), nơi bạn thực sự có thể chuyển đổi a String
thành &'static str
:
Thời gian tồn tại của tham chiếu phải luôn ngắn hơn hoặc bằng thời gian tồn tại của đối tượng được tham chiếu. Tức là đối tượng được tham chiếu phải tồn tại lâu hơn (hoặc bằng tuổi thọ) so với tham chiếu. Vì 'static
có nghĩa là toàn bộ thời gian tồn tại của một chương trình, thời gian tồn tại lâu hơn không tồn tại. Nhưng một cuộc đời bình đẳng sẽ là đủ. Vì vậy, nếu một String
có thời gian tồn tại 'static
, bạn có thể lấy &'static str
tham chiếu từ nó.
Về mặt lý thuyết, việc tạo một static
kiểu String
đã trở nên khả thi với Rust 1.31 khi const fn
tính năng này được phát hành. Thật không may, hàm chỉ const trả lại một String
là String::new()
hiện nay, và nó vẫn còn đằng sau một cửa tính năng (như vậy Rust đêm là cần thiết cho bây giờ).
Vì vậy, đoạn mã sau thực hiện chuyển đổi mong muốn (sử dụng hàng đêm) ... và thực sự không có giá trị sử dụng thực tế nào ngoại trừ việc hoàn toàn cho thấy rằng nó có thể xảy ra trong trường hợp cạnh này.
#![feature(const_string_new)]
static MY_STRING: String = String::new();
fn do_something(_: &'static str) {
}
fn main() {
do_something(&MY_STRING);
}
'static
thời gian tồn tại có nghĩa là chuỗi không bao giờ được phân bổ, tức là bị rò rỉ bộ nhớ. Tại sao bạn cần&'static str
thay vì&'a str
cho một số thích hợp'a
?