我最近一直在学习Rust,我更喜欢调用函数的语法,而不是方法。我刚刚发现了通用函数调用语法,它提供了我正在寻找的东西。
我可以把这条链子:
a.into_iter().zip(b.into_iter()).fold(0.0, |sum, (x, y)| sum + x * y)转入:
Iterator::fold(
Iterator::zip(IntoIterator::into_iter(a), IntoIterator::into_iter(b)),
0.0, |sum, (x, y)| sum + x * y)不过,我真的想摆脱这句话的冗长之处,我想写的是:
fold(zip(into_iter(a), into_iter(b)), 0.0, |sum, (x, y)| sum + x * y)我似乎找不到一种方法来做到这一点,在C++中,我会让using namespace ...处理这些合格的调用,但是我找不到一个生锈等价的(如果有)。
极小例子
fn main() {
let a = vec![1.0, 2.0, 3.0];
let b = vec![4.0, 5.0, 6.0];
// I want to change this line
let result = a.into_iter().zip(b).fold(0, |sum, (x, y)| sum + x * y);
println!("{}", result);
}发布于 2019-07-26 14:57:31
你可以用使用声明更接近你想要的东西
use std::iter::IntoIterator as ito;
use std::iter::Iterator as it;
fn main() {
let a = vec![2.3, 4.0];
let b = vec![5.6, 7.0];
//let result = a
// .into_iter()
// .zip(b.into_iter())
// .fold(0.0, |sum, (x, y)| sum + x * y);
let result = it::fold(
it::zip(ito::into_iter(a), ito::into_iter(b)),
0.0,
|sum, (x, y)| sum + x * y,
);
println!("result {}", result);!");
}发布于 2019-07-26 16:28:14
你不能这么做。
正如编译器非常明确地告诉您的那样,不能直接导入方法:
error[E0253]: `fold` is not directly importable
--> src/lib.rs:1:5
1 | use std::iter::Iterator::fold;
| ^^^^^^^^^^^^^^^^^^^^^^^^^ cannot be imported directly或
error: items in traits are not importable.
--> src/lib.rs:1:5
|
1 | use std::iter::Iterator::*;
| ^^^^^^^^^^^^^^^^^^^^^^注意,您与using namespace的比较是不正确的。Iterator是一个特性,而不是一个模块(Rust相当于名称空间)。在C++中,您不会尝试导入std::string::size,然后使用size(my_string)。
至于为什么你不能:
你的方式需要大量的嵌套(大多数人会认为这会降低可读性),防止自动完成,而且在锈蚀中不惯用。方法语法是在Rust中使用的方法。不要与一种语言的习语作斗争,因为它们与你更熟悉的语言习语不同。
方法语法确实有其优点。
的确,在C++中,空闲函数通常优于方法,但这主要是因为方法必然与类的实现相关联。它们必须在类声明中声明,该类声明提供了紧密耦合。铁锈没有这个问题,因为方法可以属于特征,任何人都可以将方法添加到任何类型(包括内置类型,而C++根本不能这样做)。
最后,请注意,即使是C++也曾提议在任何地方都使用方法语法(参见Bjarne的N4174和Herb的N4165 )。这表明这种语法有其优点。
https://stackoverflow.com/questions/57221727
复制相似问题