As linguagens de programação diferem na forma como lidam com a memória e impõem as regras de gerenciamento de memória. Go e Python empregam coletores de lixo, para que os desenvolvedores possam se concentrar em escrever código. C e C++ dão aos programadores a responsabilidade de gerenciar a memória em um nível inferior.
Rust trata o gerenciamento de memória de maneira diferente, usando conceitos que chama de propriedade e empréstimo. Ele usa um “verificador de empréstimo” para reforçar a segurança da memória com eficiência.
O que é propriedade?
A propriedade é um recurso e uma convenção do Rust que ajuda a garantir a segurança da memória de programas sem um coletor de lixo. É outra maneira de resolver o problema de vazamentos de memória em seu código.
O compilador Rust verifica se um programa obedece às regras de propriedade em tempo de compilação. Se o programa seguir essas regras, ele poderá ser executado. Se isso não acontecer, o compilador se recusa a produzir um executável.
Rust verifica as regras de propriedade usando o cheque emprestado. O verificador de empréstimo verifica o modelo de propriedade e decide se um valor na memória (pilha ou heap) está fora do escopo ou não. Se um valor estiver fora de seu escopo, não será acessível a outras partes do programa, a menos que seja emprestado.
As regras de propriedade
No Rust, cada variável possui o valor com o qual foi inicializada e só pode haver um proprietário. Quando o proprietário estiver fora do escopo, o valor será descartado. É importante entender os detalhes das regras de propriedade.
A primeira regra de propriedade é que cada variável possui seu valor inicializado.
let owner = String::from("one");
o proprietário a variável acima possui a string 1 e, ao contrário de linguagens como Python e Go, esse valor será descartado na reatribuição de variável.
A segunda regra de propriedade é que duas variáveis não podem apontar para o mesmo local de memória; cada valor pode ter apenas um proprietário.
let new_owner = owner;
o novo dono variável agora possui o valor armazenado no local de memória do proprietário variável. Se você tentar usar o proprietário variável, o compilador entrará em pânico e se recusará a gerar um executável.
Na maioria das linguagens que usam coletores de lixo, duas variáveis podem apontar para o mesmo local de memória. Aqui está um exemplo de código JavaScript equivalente:
let owner = "owner";
let new_owner = owner;
console.log(new_owner);
A execução do código JavaScript acima funciona sem erros e, se você fizer o mesmo em Go ou Python, seu programa também funcionará sem erros.
A terceira regra de propriedade é que quando uma variável está fora do escopo declarado, o valor é descartado e a memória é desalocada.
{
let example = String::from("Here's a new scope");
}print!("{}", example)
Você não pode acessar o exemplo variável fora de seu escopo; tentar fazer isso fará com que o compilador entre em pânico.
Propriedade em Funções
Quando você passa um valor para uma função como argumento, a função pode acessar essa variável mesmo que ela não tenha sido declarada em seu escopo:
fn printer(value: String) -> String {
return value
}fn main() {
let x = String::from("Prints a value");
print!("{} The Result of Printing X is that it -:", printer(x));
}
A função pode acessar essa variável porque Rust move a propriedade dela para a função em tempo de compilação.
Você pode pensar que ainda é possível usar a variável posteriormente em seu escopo original:
fn printer(value: String) -> String {
return value
}fn main() {
let x = String::from("Prints a value");
print!("{} The Result of Printing x is that it -:", printer(x));
println!("{} shouldn't be accessible", x)
}
Mas se você tentar isso, o compilador entrará em pânico e se recusará a produzir um executável:
Rust prioriza a reutilização de código
A reutilização de código é uma prática essencial, mas para praticar a reutilização de código você precisa entender as regras de propriedade do Rust.
Rust é uma linguagem de programação muito flexível. Ele fornece conceitos como empréstimo, movimentação, cópia e clonagem de propriedade para reutilização variável.