inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Giới thiệu và sử dụng Rust, một ngôn ngữ lập trình tinh tế, hiệu suất cao

Cho vay không chuyển quyền sở hữu | thuê

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

Đã giải quyết

120

suhanjung5396

1 câu hỏi đã được viết

1

fn main() {

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

let r1 = &s;

let r2 = &s;

println!("r1 = {}, r2= {}", r1, r2);

}

여기서 println! 부분에 r1을 사용하건 &r1을 사용하건 둘다 "헬로" 로 같은 값이 나옵니다.

엄밀하게 말하면 r1은 문자열s의 주소값일 것 같아서 질문 드립니다.

그리고 주소값을 바탕으로 실제 값을 가져오는 건 일반적으로 &연산자가 아닌 *연산자를 사용하지 않는지요?

rust webassembly

Câu trả lời 1

0

hatemogi


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

    let r1: &String = &s;
    let r2: &&String = &r1;
    let r3: &&&String = &&&s;

    println!("r1 = {}, r2= {}, r3 = {}", r1, r2, r3);
}

수강 및 좋은 질문 감사합니다.


우선, println!("{}", v)에서 어떤 값이 출력됐다고 해서, 그 값이 그대로 보인 게 아니라는 점을 명확히 하면 좋겠습니다.

질문에 적어주신대로, r1은 s의 주소값, 러스트 용어로 말하자면 참조값인 게 맞습니다. 둘의 타입이 명백히 다르죠. s의 타입은 String이고, r1의 타입은 &String입니다.

단지, println!매크로에 활용되는 std::fmt::Display 트레이트 구현과 러스트의 deref 규칙 때문에 화면에는 "헬로"라는 문자열이 잘 보인 것 뿐입니다.

강의에 따로 다룬 내용이 아니므로 자세히 설명드리기는 어렵습니다만, 간단하게 적자면, println!에 {}자리에 찍을 대상들은 Display::fmt 메소드를 호출하게 되어있고, 참조값인 경우 원형(참조를 해제해서)의 fmt까지 쫓아가서 출력할 수 있는 기능이 있습니다.

따라서 몇 중으로 참조한 참조값이든 원래 타입의 값이 Display할 수 있는 값이라면 같은 내용이 화면에 보이는 것입니다.

질문에 적어주신, r1을 써야하느냐, &r1을 써야 하느냐는 질문에는, 상황에 따라 다를 수 있지만, 일반적으로 이미 r1이 참조값이므로, 그걸 또 참조할 일은 흔치는 않겠다고 말씀드리겠습니다. (하지만 C/C++같은 언어에서 때로 이중포인터를 쓰기도 하니, 비슷한 용례로 쓰일 수도 있겠죠)

더 궁금하신 내용이 있으시면 편히 말씀주세요 

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

0

35

1

소스코드

0

32

1

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

0

69

1

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

0

52

2

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

0

70

2

강의 추가 계획 질문

0

76

2

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

0

148

2

임대값 수명에 대한 질문

1

122

1

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

1

154

1

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

0

166

1

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

1

210

1

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

0

377

1

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

0

193

1

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

1

366

2

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

2

418

2

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

0

268

1

혹시 어떤 폰트일까요?

0

457

2

build 오류

0

403

1

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

1

458

1

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

0

413

3

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

0

350

2

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

1

556

1

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

0

367

2

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

0

337

2