我正在寫一個函數,做兩個數組的分段乘法。Rust是否支持使用中綴運算符作爲函數?
xs.iter()
.zip(ys).map(|(x, y)| x * y)
.sum()
在其他一些語言中,我可以通過(*)
作爲功能map
。 Rust是否有這個功能?
我正在寫一個函數,做兩個數組的分段乘法。Rust是否支持使用中綴運算符作爲函數?
xs.iter()
.zip(ys).map(|(x, y)| x * y)
.sum()
在其他一些語言中,我可以通過(*)
作爲功能map
。 Rust是否有這個功能?
Nnn 是。 Sorta並不是真的。
你不能寫一個操作符作爲名字。但大多數運營商都支持特質,而你可以用寫這些名字,所以a * b
實際上是Mul::mul(a, b)
,你可以通過Mul::mul
作爲函數指針。
但是這並沒有幫助在這種情況下,因爲Iterator::map
期待FnMut((A, B)) -> C
,二元運營商都實施FnMut(A, B) -> C
。
現在,你可能爲此寫了一個適配器,但是你需要一個用於arity和mutability的每個組合。 和你必須吃堆分配和間接或需要夜間編譯器。
或者,你可以對元組的迭代器接受更高元數函數的擴展特性編寫自己的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沒有任何語法來傳遞中綴運算符,主要是因爲它無論如何都是多餘的。
在Rust中,每個操作符映射到一個特徵:例如,*
映射到std::ops::Mul
特徵。
因此,使用*
直接應該使用std::ops::Mul::mul
:
xs.iter().zip(ys).map(Mul::mul).sum();
但是有幾個困難:
Mul
爲普通值來實現迭代產生的引用,Mul::mul
期望兩個參數xs.zip(ys)
產生單個元素(兩個元素的元組)。所以,你需要從引用到值,然後「解開」元組,然後......它最終使用閉包。