reference - 为什么对泛型函数中特征的引用必须实现 `Sized` ?

标签 reference rust traits

我有一个返回特征引用的函数 (trait_ref()) 和另一个接受通用特征实现引用的函数 (take_trait_ref_generic)。

但是,无法将从第一个函数获得的引用传递给第二个函数。 Rustc 提示“特性 std::marker::Sized 没有为 SomeTrait 实现”。

即使那是真的,为什么它必须实现 Sized?无论如何,这是一个引用。

trait SomeTrait {}

struct TraitImpl;

impl SomeTrait for TraitImpl {}

struct Container {
    trait_impl: TraitImpl,
}

impl Container {
    fn trait_ref(&self) -> &SomeTrait {
        &self.trait_impl
    }
}

fn take_trait_ref_generic<T: SomeTrait>(generic_trait_ref: &T) {}

fn main() {
    let container = Container { trait_impl: TraitImpl };

    /*Not possible*/
    take_trait_ref_generic(container.trait_ref());
}

最佳答案

默认情况下,函数的所有泛型都隐式地具有Sized 绑定(bind),无论它们如何使用。您需要使用 ?Sized 明确选择退出该要求:

fn take_trait_ref_generic<T>(generic_trait_ref: &T)
where 
    T: ?Sized + SomeTrait
{}

关于reference - 为什么对泛型函数中特征的引用必须实现 `Sized` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53146037/

相关文章:

XML Schema key/keyref - 如何使用它们?

php - 取消设置 foreach 循环中的数组元素

javascript - 多维数组引用实例js

rust - 如何遍历线程句柄并在完成后加入另一个循环?

rust - 如何在对象安全方法中通过动态分派(dispatch)传递闭包?

lisp - lisp 函数可以返回引用或通过引用接收参数吗?

rust - 在匹配语句中重用匹配变量

rust - 如何使用 Rust 跟踪获取/存储跨度持续时间?

PHPUnit 确保特征满足接口(interface)

generics - 如何为对特征本身的关联类型的引用编写特征绑定(bind)?