Как мне представить "1000 без знака" отрицательные значения в коде Rust? - PullRequest
2 голосов
/ 07 января 2020

Я вызываю функцию ResumeThread WinAPI из Rust, используя ящик для винтапа .

В документации написано:

Если функция завершается успешно, возвращаемым значением является предыдущий счетчик приостановок потока.

Если функция завершается ошибкой, возвращаемое значение равно (DWORD) -1.

Как я могу эффективно проверить, не было ли ошибки?

В C:

if (ResumeThread(hMyThread) == (DWORD) -1) {
    // There was an error....
}

В Rust:

unsafe {
    if ResumeThread(my_thread) == -1 {
            // There was an error....
    }
}
the trait `std::ops::Neg` is not implemented for `u32`

Я понимаю ошибку; но как лучше семантически быть таким же, как код C? Сверьтесь с std::u32::MAX?

Ответы [ 2 ]

6 голосов
/ 07 января 2020

В C, (type) expression называется приведением типа . В Rust вы можете выполнять приведение типов с помощью ключевого слова as. Мы также даем литералу явный тип:

if ResumeThread(my_thread) == -1i32 as u32 {
    // There was an error....
}

Я бы лично использовал std::u32::MAX, потенциально переименованный, поскольку они имеют одинаковое значение:

use std::u32::MAX as ERROR_VAL;

if ResumeThread(my_thread) == ERROR_VAL {
    // There was an error....
}

См. Также:

3 голосов
/ 07 января 2020

Да, либо std::u32::MAX, либо, возможно, !0u32 (эквивалент C ~0UL, что подчеркивает тот факт, что это значение, установленное для всех битов для данного типа).

...