#rust #static #lifetime
#Ржавчина #статический #срок службы
Вопрос:
Я недавно изучал Rust, но остановился на lifetime.кто-нибудь может мне помочь? Я пытаюсь создать строковый литерал со статическим временем жизни, но когда он выходит за пределы области видимости, ссылка больше не может использоваться.
fn main(){
{
let s: amp;'static str = "hello world";
}
println("s={}",s);
}
Я получил сообщение об ошибке: s не найдено в этой области
Я пытаюсь использовать ключевое слово static
fn main(){
{
static s: amp;'static str = "hello world";
}
println("s={}",s);
}
все то же самое.
Есть ли разница между статическим ключевым словом, статическим временем жизни и областью действия?
Спасибо!
Ответ №1:
Область действия — это не то же самое, что время жизни. В большинстве случаев они похожи:
fn main() {
{ // scope starts here with '{'
let foo = Foo::new(); // create a new variable inside scope
} // scope ends here. Every owned value inside scope is deallocated.
// foo is inaccessible here
}
Даже если время жизни вашей переменной больше, чем охватывающая область, это не означает, что вы сможете получить к ней доступ за пределами области. Скорее, время жизни просто сообщает вам, как долго действительна определенная переменная.
Один из способов подумать об этом заключается в том, что все переменные принадлежат. Даже ссылки. Вы можете представить, что переменная, содержащая определенную ссылку, владеет ссылкой (а не самим фактическим значением). Когда переменная, содержащая ссылку, выходит за пределы области видимости, «принадлежащая» ссылка также удаляется, но не фактическое значение.
В вашем примере s
есть ссылка на a str
. Когда s
выходит за пределы области видимости, ссылка удаляется, но не сама фактическая str
, на которую она указывает ( 'static
поэтому она не удаляется до завершения программы).
Поскольку ссылка удалена, вы больше не можете получить к ней доступ.
Как и в вашем примере, просто поместите объявление s
в ту же или большую область, чем там, где вы бы его использовали. Поскольку значение str
является 'static
и является постоянным, вы можете просто создать глобальную переменную:
static s: amp;str = "Hello World!"; // note that 'static is implicit