gpt4 book ai didi

Rust 默认 i32 或 i64

转载 作者:行者123 更新时间:2023-12-04 07:36:29 25 4
gpt4 key购买 nike

我有 From创建我的类型的实现,但发生了一些奇怪的事情:

impl From<i64> for Object {
#[inline]
fn from(i: i64) -> Self {
Object {
i: ((((i << 16) as usize) >> 13) + NAN_VALUE as usize - 1 + classSmallInteger) as i64,
}
}
}
impl From<u64> for Object {
#[inline]
fn from(u: u64) -> Self {
Object {
i: (((u as usize) << 16 >> 13) + NAN_VALUE as usize - 1 + classSmallInteger) as i64,
}
}
}
impl From<i32> for Object {
#[inline]
fn from(i: i32) -> Self {
Object {
i: ((((i << 16) as usize) >> 13) + NAN_VALUE as usize - 1 + classSmallInteger) as i64,
}
}
}
我原本只有第一个,还有 Object::from(42)工作正常。然后我想添加一个来自u64的转换,所以我添加了第二个定义。然后 Object::from(42_u64)成功了,但是我有像 42 这样的文字的所有地方都变成了 i32,并且出现错误,所以我添加了第三种情况,以及 Object::from(42)再次工作,但被解释为 i32,仍然像 1<<35给出了溢出错误,因为 1被解释为 i32 .
我不明白为什么添加第二个定义突然使我的所有常量默认为 i32,而它们以前是 i64。
有没有地方可以将默认值更改为 i64?

最佳答案

正如@LambdaFairy 和@Stargateur 指出的那样,第二个定义的增加使得整数常量推断不明确。之前它们被推断为 i64,但是一旦出现歧义,它们就会根据 RFC212 回退到 i32。 .
很高兴被编译器告知推断不明确,但至少我现在明白了。

关于Rust 默认 i32 或 i64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67715094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com