rust

[Rust] 4.ownership(3). slice

승딱 2023. 1. 28. 19:42
반응형

Ownership Rule

 - value 는 owner 로 불리는 variable을 가지고 있다.

 - value의 owner에 해당하는 variable 은 하나만 존재한다.

 - owner 에 해당하는 varialble 이 scope 을 벗어나면 value는 drop 된다.

 

이전에 ownership을 move 하지 않으면서 값을 전달하는 방법으로 value의 값만 참조하고 ownership은 갖지않는 reference 라는걸 알아봤는데 그와 비슷하게 ownership을 가지지 않는 데이터 타입으로 slice 가 있다.

let s = String::from("hello");

let slice = &s[0..2];
let slice = &s[..2];
let slice = &s[0..len];
let slice = &s[..];

rust의 .. 문법을 사용하여 다양하게 나타낼수 있고 규칙은 js의 slice 와 동일하며(시작인덱스 ~ 마지막인덱스+1) 하는일도 비슷하게 느껴지지만 이건 borrow 해온 값이기 때문에 s가 유효한 스콥내에서만 한다.

fn main() {
    let mut s = String::from("hello world");

    let word = first_word(&s);

    s.clear(); // Error!

    println!("the first word is: {}", word);
}

fn first_word(s: &String) -> &str {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }

    &s[..]
}

위 코드 에서 word 는 s의slice 된 값이다. 즉 ownership 이 없는 reference 이며 reference 는 참조하고 있는 value 가 유효해야 한다.

근데 아래줄에서 word가 사용되기 이전에 s 가 clear 되자 rust 에서는 에러는 보여준다.