What does the ampersand (&) before `self` mean in Rust?

VariablesSyntaxRust

Variables Problem Overview


I've seen this code in the Rust documentation:

fn eat(&self) {
    println!("{} is done eating.", self.name);
}

what does the & in &self mean?

Variables Solutions


Solution 1 - Variables

This means you'll be passing in a reference to the object, as opposed to moving the object itself. It's important to distinguish this because if your function looked like:

fn eat(self) {
    println!("{} is done eating.", self.name);
}

and you tried calling it then using the variable after, you'd get an error

object = Foo::new();
object.eat();
object.something(); // error, because you moved object in eat

because when you don't specify &, rust moves the value into the function and your original binding no longer has ownership. check out this minimal example I created (playground version):

struct Foo {
    x : u32
}

impl Foo {

    fn eat(self) {
        println!("eating");
    }
    
    fn something(&self) {
        println!("else");
    }
    
}

fn main() {
    println!("Hello, world!");
    
    let g = Foo { x: 5 };
    g.eat();
    g.something();  // if this comes before eat, no errors because we arent moving
}

Now switch something to be called before eat. Because something only takes a reference, g still has ownership and you can continue on. eat on the other hand moves g and you no longer can use g.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser3522940View Question on Stackoverflow
Solution 1 - VariablesSyntactic FructoseView Answer on Stackoverflow