私は2つの配列の区分乗算を行う機能を書いています。いくつかの他の言語でRustは中置演算子を関数としてサポートしていますか?
xs.iter()
.zip(ys).map(|(x, y)| x * y)
.sum()
、私はmap
の関数として(*)
を渡すことができます。 Rustはこの機能を持っていますか?
私は2つの配列の区分乗算を行う機能を書いています。いくつかの他の言語でRustは中置演算子を関数としてサポートしていますか?
xs.iter()
.zip(ys).map(|(x, y)| x * y)
.sum()
、私はmap
の関数として(*)
を渡すことができます。 Rustはこの機能を持っていますか?
NNN はい。並べ替えまあまあではない。
は、名前のように演算子を書き込むことはできません。しかし、ほとんどの事業者は特徴が付いています、そしてあなたは者の名前を書くことができますので、a * b
が効果的Mul::mul(a, b)
あり、そしてあなたは、関数ポインタとしてMul::mul
を渡すことができます。
Iterator::map
はFnMut((A, B)) -> C
を期待しており、バイナリ演算子はすべてFnMut(A, B) -> C
を実装しているため、この場合は役に立ちません。
今、はとなりますが、これにはアダプターを記述しますが、アリティーと可変性の組み合わせごとに1つずつ必要です。 そしてあなたは、ヒープの割り当てと間接を食べる必要があるだろうかは毎晩、コンパイラが必要です。
それとも、あなたは正直なところ...、再び...タプルのイテレータのための高いアリティ関数を受け入れる拡張特性上
を各アリティのための1つを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では、各オペレーターは形質にマップします。*
は、例えばstd::ops::Mul
形質にマップされます。 *
を用いしたがって
は、直接std::ops::Mul::mul
を使用しなければならない。
xs.iter().zip(ys).map(Mul::mul).sum();
しかし、いくつかの問題がある:、Mul
は普通の値のために実装されている間
Mul::mul
2つの引数、すなわちxs.zip(ys)
は1つの要素(2つの要素のタプル)を生成します。したがって、参照から値に移動してタプルを「アンパック」し、クロージャを使用するのが短くなります。