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 _);