我正在使用 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 库的一部分)
在研究了@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
希望这可以帮助别人。