Rust에서 문자열을 숫자로 변환하는 표준 방법은 parse() 메서드입니다. 이를 통해 FromStr 트레잇을 구현하는 타입으로 변환할 수 있으며, 예를 들어 String 또는 &str을 i32, f64 등으로 변환할 수 있습니다.
예제:
let num: i32 = "42".parse().unwrap();
그러나 잘못된 문자열이 나올 경우 오류가 발생합니다 (Result::Err). 애플리케이션의 크래시를 방지하려면 결과를 match를 통해 처리하는 것이 중요합니다:
let input = "abc"; match input.parse::<i32>() { Ok(n) => println!("숫자: {}", n), Err(e) => println!("파싱 오류: {}", e), }
parse 메서드는 "turbofish" (::<i32>)를 통해 타입 오버로드를 지원합니다. 타입을 암시적으로 유추할 수 없는 경우에 사용합니다.
질문: 컴파일 시 타입을 명시하지 않고 .parse()를 호출하여 올바른 결과를 얻을 수 있나요?
자주 하는 대답: 네, 문자열이 숫자를 포함하고 있다면.
정답: 아니요, 컴파일 시 변환할 타입이 알려져 있어야 합니다. 타입이 명시되지 않으면 (예를 들어, 이후에 명시적으로 사용되지 않는 경우) 컴파일러는 오류를 발생시킵니다.
잘못된 코드 예제:
let x = "10".parse(); // 오류: 어떤 타입으로 파싱할지 불명확함
수정하려면 turbofish를 사용하세요:
let x = "10".parse::<i32>().unwrap();
사례
구성 파일을 파싱하는 모듈에서 .parse().unwrap()을 오류 처리 없이 남겨두었고, 사용자 설정에서의 오타로 인해 panic!이 발생하여 프로덕션 환경에서 애플리케이션이 중단되었습니다.
사례
한 프로젝트에서 개발자들이 타입을 명시하지 않았고 (turbofish를 사용하지 않음), 변수는 중간에 사용되지 않았기 때문에 컴파일러가 타입을 유추할 수 없어 컴파일 단계에서 잡기 힘든 오류가 발생했습니다.
사례
프로젝트에서 문자열에서 큰 숫자를 파싱할 때 실수로 parse::<u8>을 사용하여 오버플로우 오류가 발생했습니다. 오류는 수주 후에 발견되었고, 이로 인해 데이터가 손실되었습니다.