Rust 로 리트코드를 풀던 중 한 문제에서 Rust의 재미있는 특성을 발견했다.
아래 코드를 보면 count += 1이 있다. count++로 사용하려 했으나 컴파일 타임 에러로 인해 사용할 수 없었다.
Rust는 ++, --같은 연산을 허용하지 않는다는 것이 이유였다.
왜 없을까?
우선 안전성과 명확성이 그 이유라고 한다.
명확성의 경우 count += 1처럼 어떤 연산을 하는지 명확하게 보여줄 수 있다고 하는 점 때문이다.
이 부분은 조금은 이해가 가지만 안전성이란 대체 어떤 걸 이야기하는 걸까?
++가 위험하다는 걸까?
알아보니 ++의 경우 사이드 이펙트를 발생시킬 여지를 갖고 있다고 한다.
그 예시가 바로 이런 코드라고 한다.
int a = i++ + ++i;
이 코드가 컴파일러마다 결과가 달라질 수 있다고 한다. (혹은 실행환경에 따라)
직접 테스트해서 값이 달라지는걸 보진 않았지만 그렇다고 한다...
시간될때 직접 확인해보자.
우선 이런점보다는 코드 명확성이 더 크다는 개인적인 생각이 든다.
위처럼 복잡하게 작성할 여지를 아예 없애버리는거다.
count += 1로써 명확하게 1을 더한다는걸 표현하는거다.
작은 센스같은데 재밌다.
/*
1400 ~ 1405
재밌네요
*/
impl Solution {
pub fn count_digits(num: i32) -> i32 {
let num_string = num.to_string();
let num_chars: Vec<char> = num_string.chars().collect();
let mut count = 0;
for c in num_chars {
if let Some(num_c) = c.to_digit(10){
if num % num_c as i32 == 0 {
count += 1 ;
}
}
}
return count; // i32는 clone을 사용하지 않아도 됨. Copy트레이트를 구현했기 때문에 자동 복사 된다고 하는군요 !!
/**
재밌는 점은 Rust가 ++, --를 제공하지 않는 이유가 안전성과 명확성 때문이라고 하는데,
++, --가 종종 사이드 이펙트를 발생시키기 때문이라고 한다.
대체 어느 부분이서 사이드 이펙을 ?
표현의 일관성 때문이라고도 하는데, Rust에서는 모든 연산이 명시적으로 표현되도록 권장한다고 한다.
+= 1, -= 1 처럼 명확하게 드러나도록 말이다.
이 부분은 아주 조금은 동의하지만, 사이드 이펙의 예시가 궁금하다.
*/
}
}
반응형
'Rust' 카테고리의 다른 글
[Rust] 러스트 Double Linked List 코드 (0) | 2024.04.12 |
---|---|
[WASM] 웹 어셈블리의 미래 - WebAssembly (0) | 2022.01.26 |
[Rust] 러스트를 배워봅시다! - Rust language 간단 후기1 - 재밌다! (0) | 2022.01.15 |
[Rust] 러스트를 배워봅시다. (0) | 2022.01.12 |