1.2 Formatted print
출력은 macros 들을 std::fmt 에 정의하여 사용하는데 그 중 몇개를 보자:
format!: 텍스트를 형식에 맞춰String으로 작성[String]print!:format!과 같으며 콘솔로 출력.println!:print!과 같으며 새 줄 추가.format!: write formatted text toStringprint!: same asformat!but the text is printed to the console.println!: same asprint!but a newline is appended.
모든 텍스트의 분석은 같은 방식을 따른다. 추가하자면 형식화 방식의 적합성은 컴파일 시에 검증된다.
fn main() {
// 일반적으로 `{}`는 인자에 따라 자동으로 변환된다.
// 다음은 String으로 변환될 것이다.
println!("{} days", 31);
// 접미사가 없으면, 31은 i31이 된다.
// 접미사를 추가해 31의 type을 변경할 수 있다.
// 출력을 위한 다양한 옵션들이 있다.
// 위치지정 인자도 사용될 수 있다.
println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");
// 이름을 인자로 사용할 수 있다.
println!("{subject} {verb} {object}",
object="the lazy dog",
subject="the quick brown fox",
verb="jumps over");
// `:`; 뒤에 특수 형식 지정자를 사용할 수 있다..
println!("{} of {:b} people know binary, the other half don't", 1, 2);
// 넓이를 지정하여 오른쪽 정렬을 사용할 수 있다. 이는 다음과 같이 출력될 것이다.
// " 1". 5칸의 공백과 "1".
println!("{number:>width$}", number=1, width=6);
// 여분의 공간을 0으로 채운 숫자도 사용할 수 있다. 이는 "000001"을 출력할 것.
println!("{number:>0width$}", number=1, width=6);
// 위치지정 인자 사용시 정확한 수의 인자들이 왔는데 검증받게 될 것이다.
println!("My name is {0}, {1} {0}", "Bond");
// FIXME ^ 다음의 인자를 추가해서 버그를 수정해보세요 : "James"
// `i32` 내장한 구조체를 만들자. 그리고 `Structure`라고 이름지었다.
#[allow(dead_code)]
struct Structure(i32);
// 하지만, Structure와 같이 당신이 만든 형태는 좀더 복잡해진다.
// 다음 문장은 실행되지 않을 것이다.
println!("This struct `{}` won't print...", Structure(3));
// FIXME ^ 이 줄을 주석처리 해주세요.
}std:fmt는 많은 traits를 통해 텍스트를 출력한다. 두 중요한 기본형은 다음 항목들이다:
fmt::Debug:{:?}표시자로 사용된다. 디버깅을 위한 의도의 형식문자.fmt::Display:{}표시자로 사용된다. 좀 더 수려하고, 사용자 친화적 형식문자.
여기서, fmt::Display가 사용될 수 있는 이유는 표준 라이브러리에 타입을 위해 구현되어 있기 때문이다. 임의 타입을 출력하고자 한다면, 조금 더 해야할 작업이 있다.
Activities
- 위의 두 문제를 수정하여 에러 없이 출력해보세요. (FIXME를 찾으세요)
let pi = 3.141592로 pi를 선언하고Pi is roughly 3.142를 출력하는println!문을 추가해보세요. (힌트 :std::fmt를 참고해서 숫자를 형식에 맞춰 출력하는 법을 참고하세요.)