使用参数过滤迭代器

时间:2015-01-24 12:13:44

标签: rust

我想在多个struct方法中调用自定义过滤器,但它应该以某种方式访问​​struct的某个属性。

以下是我到目前为止的基本示例:

struct Collection {
    elements: Vec<isize>,
    scope: isize
}

impl Collection {
    fn action1(&self) {
        for e in (&self.elements).iter().filter(Collection::filter) {
            println!("do something ...");
        }
    }

    fn action2(&self) {
        // filter and do something with the elements
    }

    fn action3(&self) {
        // filter and do something with the elements
    }

    fn filter(cur: &&isize) -> bool {
        // Determine if current element needs to be filtered based on the scope value
        true
    }
}

fn main() {
    let c = Collection { elements: vec![1, 2, 3, 4, 5, 6, 7, 8], scope: 2 };
    c.action1();
    c.action2();
}

我知道我可以直接传递一个闭包/块作为参数,但这意味着在多个方法中复制过滤器逻辑,这是我想要避免的。

能够做到以下几点真是太好了:

fn filter(&self, cur: &&isize) -> bool {

}

然而,这不会编译,很可能是因为它实际上是一种方法,而不是一种功能。

如果函数returns a closure可能这是可行的,但我无法让过滤器接受它作为响应。

说完了,我该如何处理数据过滤?

1 个答案:

答案 0 :(得分:2)

不能工作的事情:

  • 您无法定义返回闭包的函数或方法,因为闭包类型是匿名的,无法命名。我尝试装箱结果,但它看起来并不像Fn*特征通过间接工作(可能还没有实现)。

  • 你几乎可以定义一个filter_by_scope方法来获取迭代器本身,过滤它并返回结果......除了你不能命名返回类型,因为它包含一个关闭类型。

  • 您可以定义实现ScopeFilter界面的FnMut(&&isize) -> bool类型...除了因为特征不稳定,这不是一个好主意(即使它有效)现在,肯定赢得了1.0)。

  • 您无法将成员函数/方法传递给filter,因为它不会部分应用self参数。

我能想到的最简单的事情就是直接调用过滤器逻辑方法:

struct Collection {
    elements: Vec<isize>,
    scope: isize
}

impl Collection {
    fn action1(&self) {
        for e in self.elements.iter().filter(|e| self.filter(e)) {
            println!("got {:?}", e);
        }
    }

    fn filter(&self, cur: &&isize) -> bool {
        // Determine if current element needs to be filtered based on the scope value
        **cur <= self.scope
    }
}

fn main() {
    let c = Collection { elements: vec![1, 2, 3, 4, 5, 6, 7, 8], scope: 2 };
    c.action1();
}

是的,你必须在你使用它的任何地方写封闭...但它只有六个额外的字符,而我唯一能想到的是,这会更长。

所以是的。我认为,这是近期Rust会处理得相当合理的事情,而不是现在