Как преобразовать логическое значение в целое в Rust?

Как преобразовать логическое значение в целое в Rust? Например, true становится 1, а false становится 0.

@Stargateur Я печатал их на экране для отладки, и в моем случае распечатка 1 и 0 была удобнее, чем true и false.

Newbyte 02.04.2019 07:31

Иногда полезно в арифметике, например. pub fn calculateprice(num : i32) -> i32 { return ((num > 40) as i32 * num) + num; }

S. Whittaker 30.04.2019 08:22
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
29
2
17 050
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

В ролях:

fn main() {
    println!("{}", true as i32)
}

Используйте оператор if:

if some_boolean { 1 } else { 0 }

Смотрите также:

простой тест показывает, что это на 20% быстрее, чем другие ответы.

Stein 18.09.2019 20:17

@Stein Я думаю, что твоя ссылка устарела.

Tim Diekmann 20.04.2020 16:32

Ссылка не совсем устарела, но тем временем я добавил больше тестов и оставил неясным, что это касается тестов option_cardinality. Кроме того, это не ссылка наверх, где я только что добавил README и не ссылается на конкретный файл. Кстати, они по-прежнему сообщают о той же производительности с сегодняшним ночным Rust: этот ответ или подобное выражение match быстрее (при использовании в микробенчмарке).

Stein 21.04.2020 17:29

@Stein Current nightly генерирует идентичный код для is_some_as и is_some_if: rust.godbolt.org/z/edcKef.

Solomon Ucko 30.11.2020 05:25

@SolomonUcko Кажется, не совсем так. Бенчмарки по-прежнему сообщают о той же разнице и сегодня (независимо от имен и места в файле, что может повлиять на выравнивание). Когда я заменяю -O в вашей очень полезной ссылке Godbolt на -C opt-level=3, который подается cargo bench, он сообщает о разнице в сборке.

Stein 30.11.2020 13:57

Хм, правда, интересно! Вот небольшой пример: rust.godbolt.org/z/7MM49d. Я не совсем уверен, что случилось с потоком управления для is_some_if.

Solomon Ucko 30.11.2020 23:53

Когда я запускаю те же тесты сегодня с компиляторами Rust того времени (nightly-2020-02-01, nightly-2020-04-21), микробечмарк теперь показывает, что is_some_if и matched в настоящее время не на 20% быстрее, но на 25% медленнее, чем другие ответы. Из-за обновлений микрокода/системной библиотеки?? С тех пор с различными сборками Rust все результаты колебались, иногда быстрее, иногда медленнее. Но, по-видимому, Rust никогда не генерировал один и тот же машинный код для 5 способов исходного кода.

Stein 09.12.2021 00:36

Логическое значение в Rust — гарантированно будет 1 или 0:

The bool represents a value, which could only be either true or false. If you cast a bool into an integer, true will be 1 and false will be 0.

Логическое значение, которое равно ни один0ни1, равно неопределенное поведение:

A value other than false (0) or true (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

игровая площадка

Другие вопросы по теме