Rust 默认为i32或i64
我有来自实现的Rust 默认为i32或i64,rust,Rust,我有来自实现的来创建我的类型,但奇怪的事情发生了: impl From for Object{ #[内联] fn from(i:i64)->Self{ 反对{ i:((i>13)+NAN_值作为usize-1+classSmallInteger)作为i64, } } } 对象的impl From{ #[内联] fn from(u:u64)->Self{ 反对{ i:((u作为usize)>13)+NAN_值作为usize-1+classSmallInteger)作为i64, } } } 对象的i
来创建我的类型,但奇怪的事情发生了:
impl From for Object{
#[内联]
fn from(i:i64)->Self{
反对{
i:((i>13)+NAN_值作为usize-1+classSmallInteger)作为i64,
}
}
}
对象的impl From{
#[内联]
fn from(u:u64)->Self{
反对{
i:((u作为usize)>13)+NAN_值作为usize-1+classSmallInteger)作为i64,
}
}
}
对象的impl From{
#[内联]
fn来自(i:i32)->Self{
反对{
i:((i>13)+NAN_值作为usize-1+classSmallInteger)作为i64,
}
}
}
我最初只有第一个,而且Object::from(42)
工作得很好。然后我想添加一个从u64的转换,所以我添加了第二个定义。然后Object::from(42_64)
工作了,但是所有我有文字的地方,比如42,都变成了i32s,并且我得到了错误,所以我添加了第三种情况,以及Object::from(42)
再次起作用,但被解释为i32,正如@LambdaFairy和@Stargateur指出的那样,仍然类似于1,第二个定义的添加使得整数常数推断不明确。以前,它们被推断为i64,但一旦不明确进入场景,它们就会根据返回到i32
如果编译器告诉我推断是不明确的,那就太好了,但至少我现在明白了。Rust的行为是(a)在不明确时匹配预期的类型,或者(b)默认为i32
。当您添加第二个impl
时,它引入了模糊性,从而导致行为(b)。这回答了你的问题吗?@LambdaFairy no是模糊性rust编译错误,这只是规则整数在不受约束时默认为i32。如果你问我,这是一个有争议的rust。谢谢@LambdaFairy和Stargateur。我现在理解模糊性会导致回退。我认为如果编译器明确声明它是模糊的,那会更好。不必担心@DaveMason。请随意提出问题,或者在Twitter上ping ekuber——毫无帮助的诊断被认为是一个bug。