Quais são os tipos de ferrugem denotados com um único apóstrofo?

94

Encontrei vários tipos em Rust denotados com um único apóstrofo:

'static
'r
'a

Qual é o significado desse apóstrofo? Talvez seja um modificador de referências ( &)? Digitação genérica específica para referências? Não tenho ideia de onde a documentação para isso está escondida.

Greg Malcolm
fonte
1
estes são chamados de tempos de
Arjan
O link no comentário anterior não funciona mais. Não sei se isso é equivalente: doc.rust-lang.org/book/lifetimes.html
Ellen Spertus
O link de Ellen também parou de funcionar - aqui está o novo (em junho de 2019): doc.rust-lang.org/book/ch10-03-lifetime-syntax.html

Respostas:

75

Estas são as vidas nomeadas de Rust.

Citando da The Rust Programming Language :

Cada referência em Rust tem um tempo de vida, que é o escopo para o qual essa referência é válida. Na maioria das vezes, as vidas são implícitas e inferidas, assim como a maioria dos tipos de tempo são inferidas. Da mesma forma que quando temos que anotar tipos porque vários tipos são possíveis, há casos em que os tempos de vida das referências podem ser relacionados de algumas maneiras diferentes, então Rust precisa de nós para anotar os relacionamentos usando parâmetros de vida útil genéricos para que ele possa ter certeza de que o referências reais usadas em tempo de execução serão definitivamente válidas.

As anotações vitalícias não alteram por quanto tempo nenhuma das referências envolvidas vive. Da mesma forma que as funções podem aceitar qualquer tipo quando a assinatura especifica um parâmetro de tipo genérico, as funções podem aceitar referências com qualquer tempo de vida quando a assinatura especifica um parâmetro de tempo de vida genérico. O que as anotações de tempo de vida fazem é relacionar os tempos de vida de várias referências entre si.

As anotações de tempo de vida têm uma sintaxe um pouco incomum: os nomes dos parâmetros de tempo de vida devem começar com um apóstrofo '. Os nomes dos parâmetros vitalícios são geralmente todos em minúsculas e, como os tipos genéricos, seus nomes são geralmente muito curtos. 'aé o nome que a maioria das pessoas usa como padrão. As anotações de parâmetro de tempo de vida vêm após o &de uma referência e um espaço separa a anotação de tempo de vida do tipo de referência.

Dito de outra forma, um tempo de vida se aproxima do período de execução durante o qual os dados para os quais uma referência aponta são válidos. O compilador Rust irá inferir de forma conservadora o menor tempo de vida possível para ser seguro. Se você quiser dizer ao compilador que uma referência dura mais do que a estimativa mais curta, você pode nomeá-la, dizendo que a referência de saída, por exemplo, tem o mesmo tempo de vida de uma determinada referência de entrada.

A 'staticvida é uma vida especial, a mais longa de todas as vidas - durante o programa. Um exemplo típico são strings "literais" que sempre estarão disponíveis durante a vida útil do programa / módulo.

Você pode obter mais informações nesta apresentação de slides , começando pelo slide 29.

Lifetimes in Rust também discute vidas com alguma profundidade.

quux00
fonte
0

Para adicionar à excelente resposta do quux00, os tempos de vida nomeados também são usados ​​para indicar a origem de uma variável emprestada retornada para o compilador do rust.

Esta função

pub fn f(a: &str, b: &str) -> &str {
  b
}

não compilará porque retorna um valor emprestado, mas não especifica se o emprestou de aou b.

Para corrigir isso, você declararia uma vida útil nomeada e usaria a mesma vida útil para be o tipo de retorno:

pub fn f<'r>(a: &str, b: &'r str) -> &'r str {
//      ----              ---         ---
  b
}

e use-o como esperado

f("a", "b")
Nino Filiu
fonte