我想在多个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可能这是可行的,但我无法让过滤器接受它作为响应。
说完了,我该如何处理数据过滤?
答案 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会处理得相当合理的事情,而不是现在 。