inflearn logo
강의

講義

知識共有

エレガントな高性能プログラミング言語Rustの入門と活用

메모리 관리규칙에서 질문드립니다.

解決済みの質問

209

saintheaven78290

投稿した質問数 6

1

fn main() {

    let s: String = String::from("헬로");

    let (s, len) = string_length(s);

    println!("문자열 {}의 길이는 {}", s, len);

}


fn string_length(s: String) -> (String, usize) {

    (s, s.len())

}


string_length 함수에서 선생님께서 쓰신 코드와 순서를 바꿔 입력하였을때 오류가 발생합니다.

 

선생님: (s.len(), s)

저 :(s, s.len())

 

물론 메인함수의 (s, len) 순서도 수정하였으며, string_length 함수의 반환타입도 순서도 수정하였습니다.

rust webassembly

回答 1

1

hatemogi

수강 및 예리한 질문 감사드립니다.

실험해보신 내용처럼 (s, s.len())으로 응답 튜플의 순서를 바꾸었을 때, 아래와 같은 컴파일 오류가 발생하는 것을 확인하였습니다.

 

Screenshot 2024-08-13 at 5.46.52 PM.png

 

에러의 내용은, 튜플의 첫번째 요소로써, s를 반환하기로 했기 때문에, 이 시점에 이미 소유권 반납이 이뤄졌다고 보는 거라고 이해하면 될 것 같습니다. 이미 소유권이 반납된 s를 이용해서 .len()메소드를 호출하려 할 때의 상황입니다.

 

이 문제를 해결하려면, len을 미리 값을 구해두면 되겠습니다.

 

fn main() {
    let s: String = String::from("헬로");
    let (s, len) = string_length(s);
    println!("문자열 {}의 길이는 {}", s, len);
}

fn string_length(s: String) -> (String, usize) {
    let len = s.len();
    (s, len)
}

괜한 번거로움이니, 원래대로 usize를 앞에 담은 튜플을 반환하는 것이 편하겠고, 더 나아가 이후 강의에 설명드리는 임대 개념을 사용하면 좋을 것 같습니다.

우선 이 질문과 답변의 핵심은, 소유권의 이동 시점에 관한 것이겠습니다.

 

감사합니다.

 

다음강의 플랜이 어떻게 되실까요?

0

32

1

소스코드

0

32

1

강의 자료 ppt나 pdf 파일은 없을까요?

0

69

1

선생님 ppt자료를 받아서 공부하고 싶습니다.

0

52

2

Rust는 어떻게 컴파일 타임에 dangling reference를 막나요?

0

70

2

강의 추가 계획 질문

0

76

2

소유권 이전과 관련된 질문입니다

0

146

2

&r1 을 써야하는지 r1을 써야하는지?

1

120

1

임대값 수명에 대한 질문

1

122

1

변수 가리기 shadowing 을 듣고 궁금한점이 생겼습니다.

1

154

1

튜플 구조체에서 println! 사용시 에러가 발생합니다.

0

166

1

튜플과 구조체 차이 설명에 관한 질문

0

377

1

튜플과 배열 강의 4:50에서 벡터 나중에 설명해주신다고 하셨는데

0

192

1

trait를 인자로 받을 때 &impl과 &dyn차이

1

365

2

구조체는 언제나 Heap에 저장되나요??

2

418

2

Lifecycle 강의에서 두 문자열 슬라이스를 비교해 긴 문자열 슬라이스를 리턴하는 것 관련 질문

0

268

1

혹시 어떤 폰트일까요?

0

455

2

build 오류

0

402

1

웹 어플리케이션 개발에도 잘 사용되나요?

1

458

1

임대값의 수명 강의가 재생이 안되고 있습니다~

0

412

3

임대값의 수명에 대한 강의는 언제쯤 볼 수 있을까요?

0

350

2

문자열 리터럴이 너무 어려워요ㅠㅠ

1

555

1

Integer는 자동으로 copy되서(copy type)(integer 는 stack에 할당되서)

0

366

2

명령어를 입력 한 후 source "$HOME/.cargo/env" 이 명령어를 입력해야 합니다.

0

336

2