2017-06-13 85 views

回答

11

Nnn 。 Sorta并不是真的。

你不能写一个操作符作为名字。但大多数运营商都支持特质,而你可以用写这些名字,所以a * b实际上是Mul::mul(a, b),你可以通过Mul::mul作为函数指针。

但是这并没有帮助在这种情况下,因为Iterator::map期待FnMut((A, B)) -> C,二元运营商都实施FnMut(A, B) -> C

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

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

老实说,它更简单,只需使用封闭。

3

号的*运营商在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 

你可以介绍自己的函数使用运算符*,但不会有太多附加值:)。

7

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

在Rust中,每个操作符映射到一个特征:例如,*映射到std::ops::Mul特征。

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

xs.iter().zip(ys).map(Mul::mul).sum(); 

但是有几个困难:

  1. 一般来说,而Mul为普通值来实现迭代产生的引用,
  2. Mul::mul期望两个参数xs.zip(ys)产生单个元素(两个元素的元组)。

所以,你需要从引用到值,然后“解开”元组,然后......它最终使用闭包。