1.2 Formatted print
출력은 macros
들을 std::fmt
에 정의하여 사용하는데 그 중 몇개를 보자:
format!
: 텍스트를 형식에 맞춰String
으로 작성[String
]print!
:format!
과 같으며 콘솔로 출력.println!
:print!
과 같으며 새 줄 추가.format!
: write formatted text toString
print!
: 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
를 참고해서 숫자를 형식에 맞춰 출력하는 법을 참고하세요.)