Rust中使用Borrow约束时无法访问结构体字段如何解决?
错误原因
- 泛型参数
T的trait约束Borrow<Node>仅表示该类型可以借出&Node类型的引用,T本身并不是Node类型,编译器无法确认T类型存在path字段,因此直接访问a.path会报错。
解决方案
方案1:保留原有Borrow约束的修复
调用Borrow trait提供的borrow()方法,先获取到&Node引用,再访问对应字段即可。如果需要获取拥有所有权的String可以额外调用clone()方法。
use std::borrow::Borrow; struct Node{ path: String, } fn foo<T: Borrow<Node>>(a: T) { // 先借到&Node再访问字段,拿到的是&String类型 let x = &a.borrow().path; // 如果需要拿到所有权的String,改用下面的写法 // let x = a.borrow().path.clone(); } fn main(){ let mut node = Node {path:"test".to_string()}; foo(&node); foo(&mut node); // 这个写法下甚至可以直接传所有权的Node实例 // foo(node); }
方案2:简化函数签名(无泛型)
如果你的业务场景不需要支持传入任意满足Borrow<Node>的类型,只是需要同时兼容不可变引用和可变引用作为入参,可以直接把函数参数改为&Node类型,Rust的Deref强制转换会自动把&mut Node转为&Node,代码更简洁:
struct Node{ path: String, } fn foo(a: &Node) { let x = &a.path; } fn main(){ let mut node = Node {path:"test".to_string()}; foo(&node); foo(&mut node); }
内容的提问来源于stack exchange,提问作者neuronet
相关产品推荐
相关产品推荐

