본문 바로가기

Rust

(4)
[rust] 숫자 parse 할 때 주의점 백준 문제를 rust 언어로 풀어보려고 하다가, 문자열을 파싱하는 과정에서 계속 오류가 발생했다. let mut buf = String::new(); stdin().read_line(&mut buf).expect("cannot read line!"); let N = buf.parse::().unwrap(); 코드만 보면 별 문제가 없어 보이지만, 위 코드를 통해 숫자를 입력하는 경우 panic이 발생한다. https://doc.rust-lang.org/std/io/trait.BufRead.html#method.read_line 공식 문서에 따르면 Stdin::read_line은 개행 문자('\n' == 0xA == 라인 피드)를 만날 때까지 문자열을 읽어 들인다. 다만 라인을 읽어들일 때 개행 문자까지 ..
[rust] 문자열 문자 단위로 나누기 다른 언어와 마찬가지로 rust의 문자열은 split 함수를 이용한다. let del = String::from("abcdefghijklmnopqrstuvwxyz0123456789"); let char_arr: Vec = del.split("").collect(); println!("{char_arr:?}"); 문자열을 split으로 나누면 Split 타입이 되므로, 결과를 벡터로 변환하기 위해 collect을 이용한다. 위 코드를 통해 얻는 결과는 일반적인 기대와는 달리 양 옆에 공백(empty)인 슬라이스를 표함한다. 이를 없애기 위해서는 코드를 다음과 같이 수정한다. let del = String::from("abcdefghijklmnopqrstuvwxyz0123456789"); let char_a..
[Rust] 함수(function) 러스트에서 함수는 다음과 같은 구조를 가진다. fn function_name(arg1: type1, arg2: type2 ...) -> return_type { statements [expression] } 함수는 fn으로 시작된다. 파라미터는 각각 타입을 명시해야 하며, 반환값이 있는 경우에도 -> 뒤에 타입을 명시한다. 러스트 함수에서 독특한 점은 함수 본문 마지막에 expression을 두고, 해당 값을 반환할 수 있다는 점이다. 이에 대해 설명하기 전에, 우선 expression 과 statement에 대해 알아보자. 컴파일러가 특정 소스코드를 생성하는 과정을 생각해보자. 소스코드는 Lex에 의해 어휘 분석을 거쳐 일련의 토큰 스트림을 이루게 된다. 이후 해당 토큰 스트림은 해당 언어에 대해 미리..
[Rust] 변수 변수의 선언 러스트의 변수는 let을 이용하여 선언한다. 대부분의 경우 각각의 타입을 명시해도 되고, 명시하지 않아도 된다. 이때 대부분의 프로그래밍 언어와는 달리 러스트에서의 변수는 기본적으로 "불변"의 성질을 띈다. 만약 변수를 가변적이도록 선언하고 싶다면, mut를 덧붙이면 된다. let x:i32 = 5; x = 14; // 안된다 let mut y:f64 = 17.3; y = y + 12; // 불변형이 아니므로, 된다. 잘못 생각하면 let으로 선언한 변수를 타 언어의 const 변수, 즉 상수와 헷갈릴 수도 있는데, 이 것이 상수는 아니다. 보통 상수의 경우 값을 변경할 수 없으며, 재할당이 불가능한게 대부분이다(언어마다 차이가 있다). 러스트에서의 상수 역시 이러한 부분에서 let으로 선언..