Rust支持使用中缀运算符作为函数吗?

col*_*ang 6 rust

我正在编写一个函数来执行两个数组的分段乘法.

    xs.iter()
        .zip(ys).map(|(x, y)| x * y)
        .sum()
Run Code Online (Sandbox Code Playgroud)

在其他一些语言中,我可以将其(*)作为函数传递给map.Rust有这个功能吗?

DK.*_*DK. 13

Nnn 是的.Sorta有点不是.

您不能将运算符编写为名称.但是大多数操作符都有特性支持,你可以写出这些特征的名称,因此a * b是有效的Mul::mul(a, b),你可以Mul::mul作为函数指针传递.

但是在这种情况下这没有帮助,因为Iterator::map期望a FnMut((A, B)) -> C,并且二元运算符都实现了FnMut(A, B) -> C.

现在,你可以为此编写一个适配器,但是你需要一个适用于arity和mutability的每个组合. 你必须吃堆分配和间接需要夜间编译器.

或者,您可以Iterator::map在扩展特征上编写自己的版本,该特性为元组的迭代器接受更高的arity函数...再次,每个arity一个...

老实说,只使用一个闭包更简单.


Mat*_* M. 8

Rust没有任何语法来传递中缀运算符,主要是因为它无论如何都是多余的.

在Rust中,每个运算符都映射到一个特征:例如,*映射到std::ops::Mul特征.

因此,*直接使用应该使用std::ops::Mul::mul:

xs.iter().zip(ys).map(Mul::mul).sum();
Run Code Online (Sandbox Code Playgroud)

但是有几个困难:

  1. 通常,迭代器在Mul为普通值实现时会产生引用,
  2. Mul::mul期望两个参数,xs.zip(ys)产生一个元素(两个元素的元组).

所以,你需要从引用转到值,然后"解包"元组,并且...最后使用闭包更短.