Rust 重用移动的结构实例

问题描述 投票:0回答:1

我正在使用 AntLR 和 Rust 开发语法,我需要实现一个 ErrorListener 来收集稍后需要使用的语法错误。如果我使用一个自定义侦听器,该侦听器具有指向失败令牌类型向量的内部 RefCell,当我将其传递给

parser.add_error_listener
时,我将失去所有权,并且无法再提取错误(
parser.add_error_listener
接受一个 Box,而不是对听众)。

    let listener = MyErrorListener::new();
    parser.add_error_listener(Box::new(listener));
    let res = parser.query();
    lestener.errors() // here I get error from the compiler since I already moved listener above

如何克服这个问题?当我将侦听器实例传递给

add_error_listener
函数后,有没有办法重用它?当然,在将侦听器传递给解析器时我无法克隆侦听器。 (请注意,
add_error_listener
是 AntLR rust 库的一部分)

rust antlr antlr4
1个回答
0
投票

在研究了@PitaJ的建议后,我想出了这个解决方案:

    let errors = Rc::new(RefCell::new(vec![]));
    let listener = MyErrorListener::new(&errors.clone()); // MyListener has a property errors: Rc<RefCell<Vec<isize>>>
    parser.add_error_listener(Box::new(listener));
    let res = parser.query();
    errors.as_ref().clone().into_inner().clone() // here I can access to the inner object and return it

希望这可以帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.