Я случайно заметил, что следующий код компилируется и работает, но мне любопытно, почему? Я понимаю, почему 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 не требуется, но мне не хватает опыта, чтобы подтвердить свою теорию.

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