2017-06-13 86 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)產生單個元素(兩個元素的元組)。

所以,你需要從引用到值,然後「解開」元組,然後......它最終使用閉包。