Почему Option<NonZeroU32> не требует явного использования Some?

Я случайно заметил, что следующий код компилируется и работает, но мне любопытно, почему? Я понимаю, почему Option u32 требует явного Some, но я не понимаю, почему NonZeroU32 особенный и фактически запрещает явное использование Some.

use std::num::NonZeroU32;

fn main() {
    let x : Option<u32> = Some(1);
    //let y : Option<NonZeroU32> = Some(NonZeroU32::new(2)); //doesn't compile
    let y : Option<NonZeroU32> = NonZeroU32::new(2);
    println!("{} {}", x.unwrap(), y.unwrap());
}

Я пытался искать в https://doc.rust-lang.org/stable/std/num/struct.NonZeroU32.html и https://doc.rust-lang.org/stable/src/core/num/nonzero.rs.html#25-155

Я заметил, что есть

#[rustc_nonnull_optimization_guaranteed]

и я думаю, именно поэтому явное Some не требуется, но мне не хватает опыта, чтобы подтвердить свою теорию.

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
0
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Нет, это потому, что NonZeroU32::new() уже возвращает Option<NonZeroU32> (он возвращает None, если задан ноль).

Да спасибо. Я только что нашел doc.rust-lang.org/stable/src/core/num/nonzero.rs.html#65-72, но не был уверен :) Мне нужно было поискать еще немного.

rostyslav52 09.05.2022 02:06
Ответ принят как подходящий

NonZeroU32::new() возвращает None, если аргумент n равен нулю. Option — это индикатор отказа функции. Это очень распространенный паттерн в Rust и не имеет отношения к rustc_nonnull_optimization_guaranteed

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