首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不合格使用的锈菌进口性状

不合格使用的锈菌进口性状
EN

Stack Overflow用户
提问于 2019-07-26 14:05:37
回答 2查看 533关注 0票数 2

我最近一直在学习Rust,我更喜欢调用函数的语法,而不是方法。我刚刚发现了通用函数调用语法,它提供了我正在寻找的东西。

我可以把这条链子:

代码语言:javascript
复制
a.into_iter().zip(b.into_iter()).fold(0.0, |sum, (x, y)| sum + x * y)

转入:

代码语言:javascript
复制
Iterator::fold(
    Iterator::zip(IntoIterator::into_iter(a), IntoIterator::into_iter(b)), 
    0.0, |sum, (x, y)| sum + x * y)

不过,我真的想摆脱这句话的冗长之处,我想写的是:

代码语言:javascript
复制
fold(zip(into_iter(a), into_iter(b)), 0.0, |sum, (x, y)| sum + x * y)

我似乎找不到一种方法来做到这一点,在C++中,我会让using namespace ...处理这些合格的调用,但是我找不到一个生锈等价的(如果有)。

极小例子

代码语言:javascript
复制
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);
 }
EN

回答 2

Stack Overflow用户

发布于 2019-07-26 14:57:31

你可以用使用声明更接近你想要的东西

代码语言:javascript
复制
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);!");
}
票数 3
EN

Stack Overflow用户

发布于 2019-07-26 16:28:14

你不能这么做。

正如编译器非常明确地告诉您的那样,不能直接导入方法:

代码语言:javascript
复制
error[E0253]: `fold` is not directly importable
 --> src/lib.rs:1:5
1 | use std::iter::Iterator::fold;
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^ cannot be imported directly

代码语言:javascript
复制
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 )。这表明这种语法有其优点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57221727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档