ion*_*ree 5 generics traits rust
假设我想编写一个通用函数,它采用一些类型值K并将其与一个值相乘f64. 以下作品:
fn generic1<K>(a: K, b: f64) -> K\nwhere\n K: Mul<f64, Output = K> + Add<K, Output = K> + Copy,\n f64: Mul<K, Output = K>,\n{\n a * b + b * a\n}\nRun Code Online (Sandbox Code Playgroud)\n\n但是,我现在不再能够在同一函数中将两个浮点数相乘。实际上,看起来界限f64: Mul<K, Output = K>正在覆盖/隐藏(?) implimpl Mul<f64> for f64。这是一个例子:
fn generic2<K>(a: K, b: f64) -> K\nwhere\n K: Mul<f64, Output = K> + Add<K, Output = K> + Add<f64, Output = K> + Copy,\n f64: Mul<K, Output = K>,\n{\n a * b + b * a + b * b\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这给出了以下编译器错误:
\n\n |\n16 | a * b + b * a + b * b\n | ^ expected type parameter, found f64\n |\n = note: expected type `K`\n found type `f64`\nRun Code Online (Sandbox Code Playgroud)\n\n(游乐场链接),即f64 * <whatever>现在仅适用于<whatever>类型K。
作为解决方法,我可以使用完全限定语法<f64 as Mul<f64>>::mul(b, b),但这非常难看。感觉编译器应该能够看到它可以使用类型的输出f64,因此使用的实现f64 * f64而不是f64 * K.
我想做的事情的一个不太抽象的例子:K可以是向量类型,也可以是标量类型,并且我希望能够以通用方式用它进行交换标量乘法。
这里发生了什么?为什么我不能再繁殖了b * b?
更新:@\xc3\x96mer-erden 注意到它在显式指定时f64: Mul<f64, Output = f64>也有效。不幸的是,该解决方法在导入alga板条箱时会中断- 请参阅更新的游乐场链接。
我不太确定藻类会做什么来打破已经很奇怪的行为。正如 \xc3\x96mer 已经指出的那样,看起来这更多的是类型检查器的错误或限制,而不是 alga/无论什么的错误,因为理想情况下没有代码应该能够破坏impl Mul<f64, Output = f64>任何内置类型的解析或类似的解析。
这是一个约束,它告诉我们当K是正确的操作数时,您可以f64与相乘K,输出将为K。还告诉f64必须执行Mul<K, Output = K>
f64: Mul<K, Output = K>,
Run Code Online (Sandbox Code Playgroud)
我还不知道,这可能是由于类型检查器或错误的能力有限而发生的,但不知何故,Mul<f64, Output = f64>on的实现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
}
Run Code Online (Sandbox Code Playgroud)
它会按预期工作。
| 归档时间: |
|
| 查看次数: |
1680 次 |
| 最近记录: |