Introdução Embora Rust forneça seu livro Rust, tive dificuldade em entender a palavra-chave . Eu me perguntei: "Sou o único que tem esse problema?" Uma rápida pesquisa no Google confirmou que eu não estava sozinho. mut Como resultado, decidi escrever este artigo para fornecer uma explicação detalhada da palavra-chave . Este artigo é destinado a quem vem de linguagens de alto nível, como Python ou JavaScript. mut As Variáveis Para criar uma variável imutável em Rust, basta escrever . É simples. Se você deseja criar uma variável que possa sofrer mutação posteriormente, basta adicionar a palavra-chave após . Rust tem uma convenção útil que incentiva a clareza de intenções. let x = 1337 mut let Adicionar a palavra-chave informa aos outros que esta variável será modificada em algum outro lugar do código. OK. mut Vamos visualizar isso. Duas variáveis aqui, e . let mut x = 1337 let y = 42 As referências No momento, tudo é simples. No entanto, as coisas começam a ficar um pouco complicadas ao usar referências . Vamos criar alguns. mut let mut x = 1337; let y = 42; let x_ref = &mut x; let y_ref = &y; Criei duas referências (ou "emprestadas" em termos de Rust). Uma delas é uma referência mutável e a outra é uma referência somente leitura. Vamos criar um esquema para isso novamente. No esquema fornecido, tenho 4 variáveis, 2 das quais são referências. Ambas as variáveis de referência são imutáveis e não possuem a palavra-chave após , o que significa que não posso alterar o que elas apontam. No entanto, ainda posso alterar o valor que eles fazem referência. mut let *x_ref = 777; Se você escrever isso, o compilador Rust não reclamará e o valor de (não a referência em si) mudará para . No entanto, há um quadrado vermelho no esquema indicando que não possui a opção de mutabilidade. Então, por que posso alterar o valor a que se refere? x 777 x_ref Vamos voltar ao esquema . let x_ref = &mut x O primeiro bloco branco contém o nome: . O segundo me informa sobre o tipo armazenado naquela variável. Na sua forma completa, sem quaisquer anotações de tipo implícitas, posso escrever o seguinte: x_ref let x_ref: &mut i32 = &mut x; Posso interpretar isso como: vamos criar uma chamada que manterá uma para e inicializá-la imediatamente com a para o valor na variável . variável imutável x_ref referência mutável i32 referência mutável i32 x Isso significa que posso modificar o valor para o qual ele aponta, mas não posso alterar o valor (ou endereço) da referência. Em outras palavras, não posso escrever algo como: let x_ref: &mut i32 = &mut x; let mut z = 0; x_ref = &mut z; // Not allowed! Em termos de esquemas, quero mudar a direção para a qual a seta aponta no bloco de código acima. Porém, mesmo que a variável seja mutável, não posso alterar a seta porque o problema está na imutabilidade do próprio . z x_ref Para alterar a direção da seta, preciso modificar o endereço armazenado na variável . No entanto, não posso fazer isso porque a variável é imutável. x_ref Vamos fazê-lo! let mut x: i32 = 1337; let mut x_ref: &mut i32 = &mut x; // I've added mut before x_ref let mut z = 0; x_ref = &mut z; // Allowed! Existem muitas instâncias de aqui em torno de , certo? Vamos descrevê-los. mut x_ref : estou criando uma variável mutável chamada , o que significa que posso alterar seu valor mais tarde. let mut x_ref x_ref : estou afirmando que a variável conterá referências mutáveis para algum valor do tipo . &mut i32 i32 : estou pegando emprestada (obtendo uma referência) a variável . &mut x x Então, criei uma variável chamada e atribuí a ela o valor . Posteriormente, quando escrevi , indiquei que entendo como uma variável mutável que só pode conter referências a valores . z 0 x_ref = &mut z x_ref i32 Como o tipo de é , posso atribuir seu endereço à variável . Para obter o endereço de , usei a sintaxe . z i32 x_ref z &mut z O esquema. O truque mental Dê uma olhada em na afirmação, pode parecer um pouco óbvio, mas… = let mut x_ref = &mut x; … Eu vejo isso como um divisor (especialmente se você girar 90 graus) que divide a afirmação em duas subdeclarações: esquerda e direita. O lado esquerdo fornece informações , enquanto o lado direito nos informa . sobre a própria variável sobre o valor Quando uso o operador dereference para alterar o valor... * *x_ref = 100; ... Eu não altero o valor da variável . Em vez disso, estou alterando o valor ao qual está referenciando. x_ref x_ref Referências imutáveis Eu usei com frequência antes. E se eu omitir alguns deles? mut let i = 1; let j = 2; let mut k = &i; Posso alterar o valor de aqui? Usando a técnica do divisor, é bastante simples responder. Posso alterar o valor de (vejo no lado esquerdo), mas o valor (lado direito) é uma referência imutável a (não há aqui). i k mut i mut Portanto… let i = 1; let j = 2; let mut k = &i; k = &j; // This is legal. *k = 3; // This is not. O esquema. Conclusão Neste artigo, dissecamos as nuances da palavra-chave e das referências . Lembre-se, há uma distinção entre uma e uma que contém uma referência. Nosso truque? mut referência mutável variável mutável Usando o sinal como divisor mental para entender melhor as atribuições no Rust. Esta simples visualização pode esclarecer muitas confusões. = Boa codificação!