프린트 함수
"{}"
출력
러스트의 프린트 함수는 다음과 같이 사용된다
let x = 100;
println!("{}", x);
100
이때 프린트는 위와같은 방식으로 x라는 변수를 받아서 출력된다. x의 값은 정수로 잘 출력된다.
"{:?}"
Display Trait, Debug Trait
let x = vec![1,2,3,4];
println!("{x}")
---> err
println!("{:?}",x)
---
[1,2,3,4]
러스트에서는 벡터나 배열같은 복합타입을 print할 때 특정 조취를 취하지 않으면 다음과 같은 오류를 나타낸다.
rustc: `Vec<{integer}>` doesn't implement `std::fmt::Display`
// 벡터타입은 디스플레이를 구현하고 있지 않습니다.
the trait `std::fmt::Display` is not implemented for `Vec<{integer}>`
// 디스플레이 트레이트는 벡터유형에 구현되지 않았습니다.
in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead [E0277]
// 포멧 스트링에서 `{:?}`를 사용하거나 `{:#?variable}`을 사용할 수 있습니다.
여기서 두가지 개념(트레이트와 프린트)에 대한 힌트가 나오는데 트레이트는 타입에 구현되어 사용되어지는것으로 이해할 수 있다. 만약 벡터유형에 디스플레이 트레이트가 구현되어져 있었다면 프린트함수에서 잘 출력될것으로 생각할 수 있고, 디스플레이 트레이트가 없지만 벡터유형의 경우 스트링 포멧이 필요할 때 {:?}
를 사용할 수 있다는 점이다.
즉 프린트함수는 스트링 포멧을 출력하기 위한 함수로 볼 수 있고, {:?}
를 사용하여 벡터유형을 스트링포멧으로 변환시켜준다고 이해할 수 있다.
이때 "{:?}"
는 출력대상(벡터) 유형이 가진 디버그 트레이트를 대상으로 한다.
트레이트에 대한 추가설명은 traits에서 확인하자.
"{x}"
프리티 프린트
원래 프린트 함수는 println!("{}", x)
꼴로 작동하지만 최근 러스트에서 프리티 프린트 기능이 추가되어 println!("{x}")
꼴의 형태도 출력을 지원하게 되었다.
"{:p}"
포인터 (메모리 주소)
let a = 10;
let b = &a;
println!("{:p}", b);
---
0x16cfe29dc
러스트에서는 포인터 출력을 할 수 있는데 참조형 자료를 출력할때 해당 메모리가 어딨는지 찾아낼 수 있다.
기타 출력 형식들
"{:x}"
hex
adecimal"{:o}"
o
ctal"{:b}"
b
inary"{:%}"
percent"{:,}"
큰수 천단위 구분자"{:.2f}"
소수점 두자리"{:.*f}"
소수점 출력