gpt4 book ai didi

rust - 将在 FnMut 上实现的特征传递给辅助函数而不移动

转载 作者:行者123 更新时间:2023-11-29 08:32:56 25 4
gpt4 key购买 nike

我正在尝试拥有一组可以采用 CharPredicate 的函数这是我自己的特征,通过 FnMut(char) -> bool 实现, Range<char> , char

目标是能够像这样调用助手:

scan_until(';');
scan_while('0'..='9');
scan_while(|c| { c.is_digit() });

对于其中一些助手,我想多次调用它们并在函数之间传递它们。然而,借用检查员对这个例子很生气:

#![feature(fn_traits)]

pub fn helper<P: CharPredicate>(mut predicate: P) -> bool {
predicate.test('a')
}

pub fn scan_until<P: CharPredicate>(mut predicate: P) {
// [A] This works
while predicate.test('a') {}

// [B] This doesn't: Use of moved value `predicate`
//while helper(predicate) {}

// [C] This doesn't either: the trait bound `P: std::ops::FnMut<(char,)>` is not satisfied
//while helper(&mut predicate) {}
}

pub trait CharPredicate {
fn test(&mut self, c: char) -> bool;
}

impl<F: FnMut(char) -> bool> CharPredicate for F {
fn test(&mut self, c: char) -> bool {
self.call_mut((c,))
}
}

Playground

案例A 有效;我可以在循环中多次调用谓词。

Case B 失败了,因为我在第一次迭代中将谓词移到了助手中。这对我来说很有意义。

案例 C 是我修复 B 的尝试为了让它工作,我想传递一个对闭包的引用以允许它被调用。

改变 helper采取&mut P确实允许 Case C 工作,但是 helper也可以直接调用,这意味着调用者必须输入 &mut在他们打的每一个电话前。我试着做 impl<P: CharPredicate> CharPredicate for &mut P但这最终导致与 FnMut 的特征实现发生冲突版本。

这是我可以开始工作的东西还是我必须屈服并使用 &mut在我的辅助函数中?

最佳答案

如果闭包是你的特征的有效实现,那么做一个闭包:

pub fn scan_until<P: CharPredicate>(mut predicate: P) {
while helper(|c| predicate.test(c)) {}
}

关于rust - 将在 FnMut 上实现的特征传递给辅助函数而不移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com