fn main() {
let s1 = gives_ownership(); // gives_ownership은 반환값을 s1에게
// 이동시킵니다.
let s2 = String::from("hello"); // s2가 스코프 안에 들어왔습니다.
let s3 = takes_and_gives_back(s2); // s2는 takes_and_gives_back 안으로
// 이동되었고, 이 함수가 반환값을 s3으로도
// 이동시켰습니다.
} // 여기서 s3는 스코프 밖으로 벗어났으며 drop이 호출됩니다. s2는 스코프 밖으로
// 벗어났지만 이동되었으므로 아무 일도 일어나지 않습니다. s1은 스코프 밖으로
// 벗어나서 drop이 호출됩니다.
fn gives_ownership() -> String { // gives_ownership 함수가 반환 값을
// 호출한 쪽으로 이동시킵니다.
let some_string = String::from("hello"); // some_string이 스코프 안에 들어왔습니다.
some_string // some_string이 반환되고, 호출한 쪽의
// 함수로 이동됩니다.
}
// takes_and_gives_back 함수는 String을 하나 받아서 다른 하나를 반환합니다.
fn takes_and_gives_back(a_string: String) -> String { // a_string이 스코프
// 안으로 들어왔습니다.
a_string // a_string은 반환되고, 호출한 쪽의 함수로 이동됩니다.
}
이게 뭐소리고
맞는 설명인데 너무 번잡하게 적혀있네
변수 대입하면 복사가 아니라 이동합니다 정도만 해줘도 될거같은데
drop 이라던가 이런건 나중에 설명해줘도 되고
하스켈식 설명이네 ㅋㅋ
포인터랑 다를게 뭐냐 별로 안어렵던데
러스트의 함수들은 Call by Reference로 동작한다고 이해해도 대냐 반환도 값이 아니라 참조를 반환하고
&있으면 참조 빌리는거고 없으면 이동(복사)임 반환도 마찬가지
&없으면 무조건 이동이구나 개멋지다