实现Rust Book Listing10-16引用返回修改时遇类型不匹配错误求助
解决Rust中largest函数返回引用的类型不匹配问题
这问题我之前也碰到过!咱们来一步步拆解下:
你代码里的for &item in list.iter()其实是把迭代器返回的原列表元素的引用(&T类型)给解引用成了T类型——简单说就是把元素值拷贝到了循环变量item里(当然这得是T实现了Copy才可行,要是换成String这种非Copy类型,这行代码直接就编译报错了)。而你定义的largest变量是&T类型,所以比较item > largest的时候,一边是T,一边是&T,类型对不上,自然就抛出E0308错误了。
解决这个问题的关键是不要破坏引用关系,直接使用迭代器返回的原元素引用就行,修改后的代码如下:
use std::cmp::PartialOrd; fn largest<T: PartialOrd>(list: &[T]) -> &T { let mut largest: &T = &list[0]; // 直接使用迭代器返回的&T类型引用,不解引用 for item in list.iter() { // PartialOrd对引用类型有默认实现,可直接比较引用指向的元素 if item > largest { largest = item; } } largest } fn main() { let number_list = vec![34, 50, 25, 100, 65]; let result = largest(&number_list); println!("The largest number is {}", result); let char_list = vec!['y', 'm', 'a', 'q']; let result = largest(&char_list); println!("The largest char is {}", result); }
补充说明
要是你一开始想保留for &item的写法,那得注意:就算你把比较改成item > *largest,后续赋值largest = &item会导致悬垂引用——因为item是循环里的局部变量,循环结束后就销毁了,返回这个引用会被编译器直接拦截报错,所以这种思路走不通。
内容的提问来源于stack exchange,提问作者Manuel Schmidt
相关产品推荐
相关产品推荐

