// 可以编译通过
fn main(){
let mut value = 1u8;
let value_ref1 = &mut value;
let value_ref2: &mut u8 = value_ref1;
*value_ref2 = 99;
println!("value is {}",value_ref1);
}
// 编译失败
fn main(){
let mut value = 1u8;
let value_ref1 = &mut value;
let value_ref2 = value_ref1;
*value_ref2 = 99;
println!("value is {}",value_ref1);
}
1
共 6 条评论, 1 页
评论区
写评论确实是这样。但是IDE里rr其实已经分析出来实际的推导类型,感觉编译器还有待更新啊😂
--
👇
gjh7754: 猜测是如果泛型Trait有多个泛型参数类型的实现时,则在函数调用时,编译器无法准确的推断函数入参类型,从而无法自动再借用。 而MyFrom只有一个泛型参数类型的实现,所以可以推断出函数入参类型为可变引用,从而自动进行了再借用。如果像楼下所说的再给MyFrom加一个不同泛型参数类型的实现就会出现From相同的问题。 而本文中From虽然只有一个实现,但是在std标准库里,From有一个通用的实现是涵盖所有类型的,所以编译器的类型推断就出问题了。
如果像下面这样指定泛型参数类型后,编译器就可以自动再借用了
--
👇
LazyBoy: 还有有疑问没搞懂,为什么相同的两个Trait写法,标准库的From就不行,是有什么其他隐含规则吗
猜测是如果泛型Trait有多个泛型参数类型的实现时,则在函数调用时,编译器无法准确的推断函数入参类型,从而无法自动再借用。 而MyFrom只有一个泛型参数类型的实现,所以可以推断出函数入参类型为可变引用,从而自动进行了再借用。如果像楼下所说的再给MyFrom加一个不同泛型参数类型的实现就会出现From相同的问题。 而本文中From虽然只有一个实现,但是在std标准库里,From有一个通用的实现是涵盖所有类型的,所以编译器的类型推断就出问题了。
如果像下面这样指定泛型参数类型后,编译器就可以自动再借用了
--
👇
LazyBoy: 还有有疑问没搞懂,为什么相同的两个Trait写法,标准库的From就不行,是有什么其他隐含规则吗
看起来编译器耍了一个小聪明:S::my_from 事实上只有一种可能。如果你给 S::my_from 再加个实现:
就会出现一样的错误。我的猜测是,编译器在进行重借用时,类型推断可能还没完全做完。
还有有疑问没搞懂,为什么相同的两个Trait写法,标准库的From就不行,是有什么其他隐含规则吗
--
👇
dakai-chen: 站内有一个相关文章:https://rustcc.cn/article?id=f983986d-de03-44c5-a0d0-277a4e170c4f
站内有一个相关文章:https://rustcc.cn/article?id=f983986d-de03-44c5-a0d0-277a4e170c4f