Clube do Livro #15
Clube do Livro #15
Clube do Livro #15
Clube do Livro #15
Uma grande quantidade de dados e deseja transferir a propriedade, sem ter que copiá-los
Quando você deseja alterar a propriedade um valor e se preocupa apenas se ele implementa um trait específica ao invés de ser de um tipo específico
Clube do Livro #15
Clube do Livro #15
fn main() {
let b = Box::new(5);
println!("b = {}", b);
}Clube do Livro #15
Clube do Livro #15
Clube do Livro #15
fn main() {
let list = Cons(42, Cons(69, Cons(613, Nil)));
}
Clube do Livro #15
Isso significa que podemos colocar um Box <T> dentro da variante Cons em vez de outro valor List diretamente. O Box <T> apontará para o próximo valor de List que estará na heap, e não dentro da variante Cons.
Dessa forma o compilador determinará que a variante Cons precisará do tamanho de um i32 mais o espaço para armazenar os dados do ponteiro Box<List>.
Clube do Livro #15
Para usar o "de-referenciamento" com nosso sp temos que implementar a trait Deref.
Clube do Livro #15
use std::ops::Deref;
impl<T> Deref for MyBox<T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}Clube do Livro #15
A coerção acontece automaticamente quando passamos uma referência para um tipo particular como argumento numa função ou método, sendo que o esse tipo não bate com a definição do argumento da função ou método.
Rust executa uma sequência de chamadas para o método deref para converter o tipo passado para o tipo que a função ou método precisa.
Clube do Livro #15
fn main() {
let m = MyBox::new(String::from("Rust"));
hello(&(*m)[..]);
}Clube do Livro #15
impl Drop for CustomSmartPointer {
fn drop(&mut self) {
...
}
}Clube do Livro #15
fn main() {
let c = CustomSmartPointer {
data: String::from("dados"),
};
println!("CustomSmartPointer criado.");
drop(c);
println!("CustomSmartPointer liberado antes.");
}@felubra
twitter, github, telegram:
Clube do Livro #15