Rust 中的生命周期和 IntoIter

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

我正在为 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>

您可以在这里找到我的完整代码,或者具体:

  • 对预期行为的测试这里
rust treesitter
1个回答
0
投票

解决方案是按照 kmdreko 的建议在特征实现中添加生命周期:

impl<'t, 's> IntoIterator for &'t ExtendedTree<'s>
                              ^^^

我忽略了

Self
中的
fn into_iter(self)
其实是一个参考。

我还将

source
的类型更改为更易于管理的
String
as
查伊姆·弗里德曼建议

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