Example

#[derive(Debug)]
struct Race {
    name: String,
    laps: Vec<i32>,
}

impl Race {
    // ์ด ๋ฉ”์„œ๋“œ๋Š” self๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ •์  ๋ฉ”์„œ๋“œ ์ž…๋‹ˆ๋‹ค. 
    // No receiver, a static method
    fn new(name: &str) -> Race {  
        Race { name: String::from(name), laps: Vec::new() }
    }

    // ์ด ๋ฉ”์„œ๋“œ๋Š” self์— ๋Œ€ํ•œ ๋…์ ์ ์ธ ์ฝ๊ธฐ-์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
    // Exclusive borrowed read-write access to self
    fn add_lap(&mut self, lap: i32) {  
        self.laps.push(lap);
    }

    // ์ด ๋ฉ”์„œ๋“œ๋Š” self ๋Œ€ํ•œ ๊ณต์œ  ๋ฐ ์ฝ๊ธฐ์ „์šฉ ๋นŒ๋ฆผ ๊ถŒํ•œ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
    // Shared and read-only borrowed access to self
    fn print_laps(&self) {  
        println!("Recorded {} laps for {}:", self.laps.len(), self.name);
        for (idx, lap) in self.laps.iter().enumerate() {
            println!("Lap {idx}: {lap} sec");
        }
    }

    // ์ด ๋ฉ”์„œ๋“œ๋Š” self์˜ ์†Œ์œ ๊ถŒ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. 
    // self๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ ๋œ ํ›„ main์—์„œ race ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    // Exclusive ownership of self
    fn finish(self) {  
        let total = self.laps.iter().sum::<i32>();
        println!("Race {} is finished, total lap time: {}", self.name, total);
    }
}

fn main() {
    let mut race = Race::new("Monaco Grand Prix");
    race.add_lap(70);
    race.add_lap(68);
    race.print_laps();
    race.add_lap(71);
    race.print_laps();
    race.finish();
}