首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何构造树结构,其中节点包含对包含树结构的字段的引用

如何构造树结构,其中节点包含对包含树结构的字段的引用
EN

Stack Overflow用户
提问于 2018-03-20 12:01:25
回答 1查看 296关注 0票数 1

我正在使用Rust中的AST,我认为如果所有节点都能简单地将切片包含到原始源字符串中,而不是复制内存的话,这将是一件很好的事情。但是,我无法确定如何在代码中构建生命周期,以便实现这一目标。我天真的尝试产生了这个程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#[derive(Debug)]
struct Node<'source> {
    slice   : &'source str,
    nid     : usize       ,
    parent  : usize       ,
    children: Vec<usize>  ,
}

#[derive(Debug)]
struct Tree<'source> {
    source: String            ,
    nodes : Vec<Node<'source>>,
}

impl<'source> Tree<'source> {
    fn new() -> Self {
        Tree {source: String::from("Hello World"), nodes: vec![]}
    }

    fn slice(&'source mut self, from: usize, to: usize) {
        let new_nid = self.nodes.len();
        self.nodes.push(
            Node { slice: &self.source[from..to], nid: new_nid, parent: 0, children: vec![] }
        );
    }
}


fn main() {
    let mut tree = Tree::new();
    tree.slice(2, 6);
    println!("{:?}", tree);
}

编译器输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
error[E0502]: cannot borrow `tree` as immutable because it is also borrowed as mutable
  --> ast.rs:32:22
   |
31 |     tree.slice(2, 6);
   |     ---- mutable borrow occurs here
32 |     println!("{:?}", tree);
   |                      ^^^^ immutable borrow occurs here
33 | }
   | - mutable borrow ends here

这没有编译,因为:

  • 节点包含的切片需要超过slice()函数调用的生存期。
  • 因此,由self获取的对slice()的可变引用需要超过slice()函数调用。
  • 因此,在tree函数中的tree.slice()调用之后,main仍然是不断借用的。
  • 因此,println!宏无法编译。

理想情况下,节点中的切片需要能够超过slice()调用,但是可变引用self不应该存在。我了解到,借用检查器禁止这样做,因为self包含片引用的source字符串。

考虑到这一点,我如何重构代码以允许节点包含到源代码中,而不必借用self的时间超过slice函数的长度?这是可行的,还是需要我求助于unsafe

EN

回答 1

Stack Overflow用户

发布于 2018-03-20 13:11:52

解决问题的最简单方法是存储std::ops::Range<usize>而不是&str。然后,当您需要查看实际字符串时,在AST上提供一个接受Range<usize>并返回&str的方法。

另一种方法是不拥有原始字符串,而是将AST绑定到解析字符串的生存期,例如,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#[derive(Debug)]
struct Tree<'source> {
    source: &'source str,
    nodes : Vec<Node<'source>>,
}

你不能这样做,你有它的设置,因为锈不知道如何检查兄弟借款。如果你在搜索兄弟姐妹的借款问题,你会得到更多的上下文。

来源:https://www.reddit.com/r/rust/comments/85vm4k/building_a_tree_structure_where_the_nodes_contain/dw0jdzp/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49393139

复制
相关文章
目录树结构
实际项目中后端生成目录树的json是比较常见的,hutool中提供了treeUtil使用起来比较方便。先做个记录
在水一方
2022/06/14
9340
数据结构:树结构
除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。层序遍历就是从所在二叉树的根节点出发,自上而下,自左至右逐层访问树的结点的过程。
ttony0
2022/12/26
2K0
数据结构:树结构
【MYSQL包含逗号的字段拆分查询】
案例: SELECT DISTINCT tpi.`standard_catalog_code`, tpi.`groups` groups FROM plan_info tpi WHE
用户5640963
2019/07/25
7.8K0
【MYSQL包含逗号的字段拆分查询】
2021-06-13:如果一个节点X,它左树结构和右树结构完全一
2021-06-13:如果一个节点X,它左树结构和右树结构完全一样,那么我们说以X为头的树是相等树。给定一棵二叉树的头节点head,返回head整棵树上有多少棵相等子树。
福大大架构师每日一题
2021/06/14
3220
2021-06-13:如果一个节点X,它左树结构和右树结构完全一
数据结构-树结构
我们首先来看,什么是“树”?再完备的定义,都没有图直观。所以我在图中画了几棵“树”。你来看看,这些“树”都有什么特征?
acc8226
2022/05/17
1.9K0
数据结构-树结构
字符串转树结构
有一个多行字符串,每行开头会用空格来表示它的层级关系,每间隔一层它的空格总数为2,如何将它转为json格式的树型数据?本文就跟大家分享下这个算法,欢迎各位感兴趣的开发者阅读本文。
神奇的程序员
2022/10/30
3.3K0
字符串转树结构
MySQL中 如何查询表名中包含某字段的表
information_schema 是MySQL系统自带的数据库,提供了对数据库元数据的访问 information_schema.tables 指数据库中的表(information_schema.columns 指列) table_schema 指数据库的名称 table_type 指是表的类型(base table 指基本表,不包含系统表) table_name 指具体的表名
全栈程序员站长
2022/02/10
12.8K0
Java实现递归查询树结构
        我们在实际开发中,肯定会用到树结构,如部门树、菜单树等等。Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示。今天,咱们就来说说怎么样将List集合转换成TreeList。
军军不吃鸡
2022/12/02
2.7K0
树工具类
public static List<SysDict> buildTree(List<SysDict> list, String pid){ List<SysDict> treeList = new LinkedList<>(); for (SysDict sysDict : list) { if (sysDict.getParentId().equals(pid)) { sysDict.setChild(buildTree(l
在下是首席架构师
2022/08/18
7950
树工具类
Python绘制带标记和箭头的树结构
本文要点在于Python扩展库matplotlib的text()方法与annotate()的使用。 import matplotlib.pyplot as plt plt.figure(1, figsize=(8,8)) ax = plt.subplot(111) def drawNode(text, startX, startY, endX, endY, ann): #绘制带箭头的文本 ax.annotate(text, xy=(startX+0.01, star
Python小屋屋主
2018/04/16
2K0
Python绘制带标记和箭头的树结构
一种好用的树结构:Trie树
在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。
致Great
2022/05/13
5320
一种好用的树结构:Trie树
以太坊提案 Verkle 树结构
Verkle 树[2](音译为 “沃克尔树”)是一种承诺方案(commitment schme),其工作方式类似于 Merkle 树[3],但证据的大小要小得多。用向量承诺替换 Merkle 树中的哈希,这使得广泛的分支因子更高效。
Tiny熊
2022/05/25
2.2K0
以太坊提案 Verkle 树结构
Python 自动化-pywinauto库定位树结构控件里的树节点实例演示
然后通过 get_item('\本地计算机 策略\计算机配置\管理模板') 层级定位的方式即可定位到树节点。
小蓝枣
2021/12/01
1.5K0
Python 自动化-pywinauto库定位树结构控件里的树节点实例演示
mysql 字段包含某个字符的函数
 通过sql查询语句,查询某个字段中包含特定字符串: 例子:查询e_book表的types字段包含字符串"3",有下面4种方式 select * from e_book where types like "%3%"; select * from e_book where find_in_set('3', types); select * from e_book where locate('3', types); select * from e_book where INSTR(types,'3');
凯哥Java
2019/06/28
6K0
mysql 字段包含某个字符的函数
快速学习-以太坊中树结构
以太坊中树结构 以太坊中所有的 merkel 树都是 MPT 在一个区块的头部(block head)中,有三颗 MPT 的树根: • stateRoot • 状态树的树根 • transactionRoot • 交易树的树根 • receiptsRoot • 收据树的树根 状态树(state trie) • 世界状态树,随时更新;它存储的键值对 (path, value) 可以表示为 (sha3(ethereumAddress), rlp(ethereumAccount) ) •
cwl_java
2022/11/30
8450
快速学习-以太坊中树结构
业务实战中用到树结构
Dlimeng
2023/06/30
1310
使用tree生成目录树结构
有时候,当你完成一个项目后,想要展示这个项目的目录结构(如下图所示),对该项目进行文档描述性说明,用于解释其项目中各个目录以及文件代表的含义,这样便于自己和后来的同学理解
itclanCoder
2020/10/28
3.3K0
使用tree生成目录树结构
点击加载更多

相似问题

让用户引用树结构的节点

12

如何使用Rust对树结构中的单个节点具有多个引用

10

命名树结构的节点

25

持久化文件树结构和节点引用

12

叶中包含单个文件的复制树结构

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文