我正在写一个函数,做两个数组的分段乘法。Rust是否支持使用中缀运算符作为函数?
xs.iter()
.zip(ys).map(|(x, y)| x * y)
.sum()
在其他一些语言中,我可以通过(*)
作为功能map
。 Rust是否有这个功能?
我正在写一个函数,做两个数组的分段乘法。Rust是否支持使用中缀运算符作为函数?
xs.iter()
.zip(ys).map(|(x, y)| x * y)
.sum()
在其他一些语言中,我可以通过(*)
作为功能map
。 Rust是否有这个功能?
Nnn 是。 Sorta并不是真的。
你不能写一个操作符作为名字。但大多数运营商都支持特质,而你可以用写这些名字,所以a * b
实际上是Mul::mul(a, b)
,你可以通过Mul::mul
作为函数指针。
但是这并没有帮助在这种情况下,因为Iterator::map
期待FnMut((A, B)) -> C
,二元运营商都实施FnMut(A, B) -> C
。
现在,你可能为此写了一个适配器,但是你需要一个用于arity和mutability的每个组合。 和你必须吃堆分配和间接或需要夜间编译器。
或者,你可以对元组的迭代器接受更高元数函数的扩展特性编写自己的Iterator::map
版本......再次,每一个元数...
老实说,它更简单,只需使用封闭。
号的*
运营商在std::Ops::Mul
实现,但它不能直接使用:
use std::ops::Mul::mul;
fn main() {
let v1 = vec![1, 2, 3];
let v2 = vec![1, 2, 3];
println!("{:?}", v1.iter().zip(v2).map(|(x, y)| mul).collect());
}
将导致以下错误:
error[E0253]: `mul` is not directly importable
--> <anon>:1:5
|
1 | use std::ops::Mul::mul;
| ^^^^^^^^^^^^^^^^^^ cannot be imported directly
你可以介绍自己的函数使用运算符*
,但不会有太多附加值:)。
Rust没有任何语法来传递中缀运算符,主要是因为它无论如何都是多余的。
在Rust中,每个操作符映射到一个特征:例如,*
映射到std::ops::Mul
特征。
因此,使用*
直接应该使用std::ops::Mul::mul
:
xs.iter().zip(ys).map(Mul::mul).sum();
但是有几个困难:
Mul
为普通值来实现迭代产生的引用,Mul::mul
期望两个参数xs.zip(ys)
产生单个元素(两个元素的元组)。所以,你需要从引用到值,然后“解开”元组,然后......它最终使用闭包。