2017-06-13 15 views

答えて

11

NNN はい。並べ替えまあまあではない。

は、名前のように演算子を書き込むことはできません。しかし、ほとんどの事業者は特徴が付いています、そしてあなたは者の名前を書くことができますので、a * bが効果的Mul::mul(a, b)あり、そしてあなたは、関数ポインタとしてMul::mulを渡すことができます。

Iterator::mapFnMut((A, B)) -> Cを期待しており、バイナリ演算子はすべてFnMut(A, B) -> Cを実装しているため、この場合は役に立ちません。

今、となりますが、これにはアダプターを記述しますが、アリティーと可変性の組み合わせごとに1つずつ必要です。 そしてあなたは、ヒープの割り当てと間接を食べる必要があるだろうかは毎晩、コンパイラが必要です。

それとも、あなたは正直なところ...、再び...タプルのイテレータのための高いアリティ関数を受け入れる拡張特性上

を各アリティのための1つを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では、各オペレーターは形質にマップします。*は、例えばstd::ops::Mul形質にマップされます。 *を用いしたがって

は、直接std::ops::Mul::mulを使用しなければならない。

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

しかし、いくつかの問題がある:、Mulは普通の値のために実装されている間

  1. は一般に、イテレータは参照を得

  2. Mul::mul 2つの引数、すなわちxs.zip(ys)は1つの要素(2つの要素のタプル)を生成します。

したがって、参照から値に移動してタプルを「アンパック」し、クロージャを使用するのが短くなります。

関連する問題