Rust 传递Rc时出错<;dyn性状>;作为函数参数
在将Rust 传递Rc时出错<;dyn性状>;作为函数参数,rust,Rust,在将Rc作为函数参数传递时,我遇到了一些奇怪的行为。下面的代码演示了这个问题 use std::rc::Rc; trait Trait {} struct Struct {} impl Trait for Struct {} fn function(_t: Rc<dyn Trait>) {} fn main() { let n = Rc::new(Struct {}); // ok let r = Rc::clone(&n); fu
Rc
作为函数参数传递时,我遇到了一些奇怪的行为。下面的代码演示了这个问题
use std::rc::Rc;
trait Trait {}
struct Struct {}
impl Trait for Struct {}
fn function(_t: Rc<dyn Trait>) {}
fn main() {
let n = Rc::new(Struct {});
// ok
let r = Rc::clone(&n);
function(r);
// error, why?
// function(Rc::clone(&n));
}
Struct
实现Trait
。为什么会出现此错误?这基本上只是类型推断规则中的一个折痕。为了调用Rc::clone(&n)
,编译器必须知道Rc
的类型参数是什么
let r = Rc::clone(&n);
function(r);
在第一行,编译器看到调用Rc::clone
的参数类型为&Rc
。它可以自由选择r
的类型,因此它推断被调用的函数应该是Rc:::clone
,r
也是Rc
。移动到下一行,调用function(r)
只是r
到Rc
在这里,编译器再次必须为Rc
选择一个类型参数,但它没有完全的自由:它必须选择可以传递给函数的内容。因此它假设类型参数是dyn Trait
,因为Rc
是函数
所期望的
但是,您不能调用Rc:::clone(&n)
,因为虽然Rc
可以强制为Rc
,但是(您不能强制&Rc
为&Rc
)。因此,强制不能在Rc::clone(…)
调用中发生
通过使用turbofish将type参数指定为Struct
,可以编译单行版本:
function(Rc::<Struct>::clone(&n));
n.clone()
也可以工作,因为类型参数没有任何疑问:它总是会找到Rc:::clone
,因为自动取消引用只查看接收方类型(类型n
),而不关心表达式的上下文
相关的
为什么不n.clone()
?我对这种语言不熟悉,但文档表明,在处理Rc时,Rc::clone是首选语法,用于表示处理的是Rc而不是副本。有趣的是,n.clone()是有效的……我正试图想出一个能起作用的turbofish版本,但我运气不好。我认为,Rc::clone
无法了解由于返回类型与给定值的定义冲突而发生的情况,而n.clone()
只需处理返回类型。我也尝试过,但运气不佳。:-)我本以为,Rc::clone::(&n)
可以做到这一点,但这只会让事情变得更糟。也许更了解锈的人可以加入进来。
function(Rc::<Struct>::clone(&n));
function(Rc::clone(&n) as _);