gpt4 book ai didi

generics - 特征绑定(bind)到通用特征

转载 作者:行者123 更新时间:2023-11-29 08:28:08 27 4
gpt4 key购买 nike

我想知道如何创建绑定(bind)到通用特征的通用函数。

在这个例子中我选择了BitXor . std::ops::BitXor的声明是BitXor<RHS, Result> .

所以如果我们有我们的函数:

fn e<T: BitXor>(m:T, k:T) -> T {
m ^ k
}

编译器会报错:

error: Wrong number of type arguments: expected 2 but found 0.

所以我尝试了:

fn e<T: BitXor<U, V>, U, V>(m:T, k:T) -> T {
m ^ k
}

但是得到了相当困惑的错误:

Mismatched types: expected `U` but found `T` (expected type parameter but found type parameter).

有什么解决办法吗?

最佳答案

这里是 BitXor 特征的完整定义:

#[lang="bitxor"]
pub trait BitXor<RHS, Result> {
fn bitxor(&self, rhs: &RHS) -> Result;
}

注意 rhs操作数的类型是 &RHS .在你的情况下,RHSU (因为你有 BitXor<U, V> ),但 k ,您将其传递为 rhs通过 ^运算符,类型为 T .同样,结果的类型是 Result ,在你的例子中是 V ,但您的函数返回 T .

根据您的用例,有两种可能的签名:

fn e<T: BitXor<U, V>, U, V>(m: T, k: U) -> V {
m ^ k
}

在这一个中,我们使用更多的类型参数来获得最大的通用性。

fn e<T: BitXor<T, T>>(m: T, k: T) -> T {
m ^ k
}

在这一个中,我们牺牲通用性以将所有值限制为同一类型。

关于generics - 特征绑定(bind)到通用特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24715154/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com