Как преобразовать логическое значение в целое в Rust? Например, true становится 1, а false становится 0.
Иногда полезно в арифметике, например. pub fn calculateprice(num : i32) -> i32 { return ((num > 40) as i32 * num) + num; }

В ролях:
fn main() {
println!("{}", true as i32)
}
Используйте оператор if:
if some_boolean { 1 } else { 0 }
Смотрите также:
простой тест показывает, что это на 20% быстрее, чем другие ответы.
@Stein Я думаю, что твоя ссылка устарела.
Ссылка не совсем устарела, но тем временем я добавил больше тестов и оставил неясным, что это касается тестов option_cardinality. Кроме того, это не ссылка наверх, где я только что добавил README и не ссылается на конкретный файл. Кстати, они по-прежнему сообщают о той же производительности с сегодняшним ночным Rust: этот ответ или подобное выражение match быстрее (при использовании в микробенчмарке).
@Stein Current nightly генерирует идентичный код для is_some_as и is_some_if: rust.godbolt.org/z/edcKef.
@SolomonUcko Кажется, не совсем так. Бенчмарки по-прежнему сообщают о той же разнице и сегодня (независимо от имен и места в файле, что может повлиять на выравнивание). Когда я заменяю -O в вашей очень полезной ссылке Godbolt на -C opt-level=3, который подается cargo bench, он сообщает о разнице в сборке.
Хм, правда, интересно! Вот небольшой пример: rust.godbolt.org/z/7MM49d. Я не совсем уверен, что случилось с потоком управления для is_some_if.
Когда я запускаю те же тесты сегодня с компиляторами Rust того времени (nightly-2020-02-01, nightly-2020-04-21), микробечмарк теперь показывает, что is_some_if и matched в настоящее время не на 20% быстрее, но на 25% медленнее, чем другие ответы. Из-за обновлений микрокода/системной библиотеки?? С тех пор с различными сборками Rust все результаты колебались, иногда быстрее, иногда медленнее. Но, по-видимому, Rust никогда не генерировал один и тот же машинный код для 5 способов исходного кода.
Логическое значение в Rust — гарантированно будет 1 или 0:
The
boolrepresents a value, which could only be eithertrueorfalse. If you cast aboolinto an integer,truewill be 1 andfalsewill be 0.
Логическое значение, которое равно ни один0ни1, равно неопределенное поведение:
A value other than
false(0) ortrue(1) in a bool.
Поэтому вы можете просто привести его к примитиву:
assert_eq!(0, false as i32);
assert_eq!(1, true as i32);
Вы можете использовать .into():
let a = true;
let b: i32 = a.into();
println!("{}", b); // 1
let z: isize = false.into();
println!("{}", z); // 0
@Stargateur Я печатал их на экране для отладки, и в моем случае распечатка 1 и 0 была удобнее, чем
trueиfalse.