我正在为 rust 树坐骑绑定开发一些 Rust 实用程序。 Tree Sitter 本质上是解析一些代码并创建一个抽象语法
Tree
。该树由代表代码结构的 Node
组成(例如 csharp class
es),并且可以使用 TreeCursor
进行遍历
我想通过实现一些包装类型来扩展现有功能,我称之为
ExtendedTree
、ExtendedTreeCursor
和 ExtendedNode
。
我想尝试和实现的便利功能之一是我可以访问
source
代码,该代码用于从所有类创建 Extended
类。该源代码不应在整个应用程序运行时发生更改,我将其存储为 source: Rc<&str>
。因为它是一个参考,所以需要一生,我称之为's
。
此外,
TreeCursor
和Node
都有生命周期,我称之为't
。 Tree
不需要生命周期,因此ExtendedTree
也只有生命周期's
而没有't
。
我想实现一种从
ExtendedCursor
创建 &'t ExtendedTree
的方法,我成功做到了:
fn get_cursor<'t>(self: &'t Self) -> ExtendedTreeCursor<'t, 's>
where
's: 't,
{
ExtendedTreeCursor::new(
self.ts_tree.root_node().walk(),
&self.get_complete_source().clone(),
)
}
但后来我想起来,有一个
IntoIterator
的特质,应该更优雅。
但我没能实现
IntoIterator
。我最好的尝试是:
impl<'t, 's> IntoIterator for ExtendedTree<'s>
where
's: 't,
{
type Item = ExtendedNode<'t, 's>;
type IntoIter = ExtendedTreeCursor<'t, 's>;
fn into_iter(self) -> Self::IntoIter {
ExtendedTreeCursor::new(
self.ts_tree.root_node().walk(),
&self.get_complete_source().clone(),
)
}
}
它会导致以下错误:
error[E0207]: the lifetime parameter `'t` is not constrained by the impl trait, self type, or predicates
--> src\tree_extensions\extended_tree.rs:47:6
|
47 | impl<'t, 's> IntoIterator for ExtendedTree<'s>
| ^^ unconstrained lifetime parameter.
注意:删除
't
会导致下面的 undeclared lifetime
出现 type Item
。
我想知道我做错了什么,是否有可能在生命周期
IntoIterator
和't
中实现's
。
注意:我确实设法实现了
Iterator for ExtendedTreeCursor<'t, 's>
。
您可以在这里找到我的完整代码,或者具体:
解决方案是按照 kmdreko 的建议在特征实现中添加生命周期:
impl<'t, 's> IntoIterator for &'t ExtendedTree<'s>
^^^
我忽略了
Self
中的fn into_iter(self)
其实是一个参考。
我还将
source
的类型更改为更易于管理的 String
as