gpt4 book ai didi

generics - 在 Rust 中一般乘以不同类型的值

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

假设我想编写一个通用函数,它接受一些类型为 K 的值并将其与 f64 交换相乘。以下作品:

fn generic1<K>(a: K, b: f64) -> K
where
K: Mul<f64, Output = K> + Add<K, Output = K> + Copy,
f64: Mul<K, Output = K>,
{
a * b + b * a
}

但是,我现在无法再使用,例如在同一个函数中乘以两个 float 。实际上,绑定(bind) f64: Mul<K, Output = K> 似乎覆盖/隐藏(?)impl impl Mul<f64> for f64 。这是一个例子:

fn generic2<K>(a: K, b: f64) -> K
where
K: Mul<f64, Output = K> + Add<K, Output = K> + Add<f64, Output = K> + Copy,
f64: Mul<K, Output = K>,
{
a * b + b * a + b * b
}

这给出了以下编译器错误:

   |
16 | a * b + b * a + b * b
| ^ expected type parameter, found f64
|
= note: expected type `K`
found type `f64`

( playground link ),即 f64 * <whatever> 现在仅适用于类型为 <whatever>K

作为变通方法,我可以使用完全限定的语法 <f64 as Mul<f64>>::mul(b, b) ,但这非常难看。感觉编译器应该能够看到它可以使用 f64 类型的输出,因此使用 f64 * f64 而不是 f64 * K 的实现。

关于我想做的事情的一个不太抽象的例子:K 可以是一个向量类型,也可以是一个标量类型,我希望能够以一种通用的方式用它做交换标量乘法。

这是怎么回事?为什么我不能再乘以 b * b

更新:@Ömer-erden 注意到它在显式指定 f64: Mul<f64, Output = f64> 时也有效。不幸的是,当导入 alga crate 时,解决方法会中断 - 请参阅 updated playground link

我不太确定藻类会如何打破已经很奇怪的行为。正如 Ömer 已经指出的那样,这看起来更像是类型检查器的错误或限制,而不是 alga 中的错误/任何东西,因为理想情况下,任何代码都不应该能够破坏 impl Mul<f64, Output = f64> 或任何内置类型的类似分辨率。

最佳答案

这是一个约束,告诉我们什么时候 K是一个右操作数,你可以乘以f64K , 输出将为 K .还告诉f64必须实现 Mul<K, Output = K>

f64: Mul<K, Output = K>,

我还不知道,这可能是因为类型检查器的功能有限或错误但以某种方式实现了 Mul<f64, Output = f64>f64由于约束 Mul<K, Output = K> 变得不明确.

如果您明确声明预期行为,即 Mul<f64, Output = f64>在你的情况下:

fn generic2<K>(a: K, b: f64) -> K
where
K: Mul<f64, Output = K> + Add<K, Output = K> + Add<f64, Output = K> + Copy,
f64: Mul<K, Output = K> + Mul<f64, Output = f64>,
{
a * b + b * a + b * b
}

它将按预期工作。

Playground

关于generics - 在 Rust 中一般乘以不同类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58657264/

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