#[derive(Debug)]
pub enum Salt<'a> {
A(&'a [u8]),
B(usize)
}
impl <'a> Salt<'a> {
fn as_slice(&self) -> &[u8] {
match(self) {
Self::A(d) => d,
Self::B(size) => {
//case1 컴파일 오류남. out of scope value가 borrow 하려하기 때문
vec![0x30u8; *size].as_slice()
//case2 오류 발생 안함. 소유권은 호출자가?
//&[ 0x30u8; 5]
}
}
}
}
fn salt_process(salt:Salt) {
dbg!( salt.as_slice() );
}
fn main() {
let hold_array = &[0,1,2,3];
salt_process( Salt::A(hold_array) );
salt_process( Salt::B(5) );
}
위 같은 상황에서 case1 은 오류가 나는걸 알겠음. 해제되는 vec을 참조하려고 했으니..
그렇다면 case2 의 경우는 왜 오류가 나지 않을까? case2 는 생성한 value 의 참조를 리턴하는것이 아니라
상수의 참조를 리턴하는거였음.. &[ *size as u8; 5] 와 같이 동적으로 바꾸면 컴파일 오류가 발생함
러스트에선 가끔 이게 불편함...
소유권을 누군가 가지고 있어야 하기 때문에
소유코드를 넣어줘야하는 경우가 가끔 생기는데
이게 좀 어거지같은 기분이라
gc 언어는 저걸 전부 런타임에 gc가 체크하는거라서 편하다고 마냥 좋은건 아님
gc가 없으니 코드상으로 소유권이 확실히 있어야 한다는건 이해함. 요즘은 rust 술술 코딩하다가도 가끔 temporary value 최적화에서 걸리적거림..
ㅇㅇ 신경쓸부분 많은건 팩트다