Rust

[Rust] Rust가 ++연산자를 지원하지 않는 이유

Razelo 2024. 5. 3. 14:19

 

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 처럼 명확하게 드러나도록 말이다. 
 
            이 부분은 아주 조금은 동의하지만, 사이드 이펙의 예시가 궁금하다. 
        */
    }
}

 

 

반응형