问题标签 [refcell]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
75 浏览

rust - 了解 Rust `Rc>`

我正在尝试创建一个类型定义类似于的树

带插入功能

这非常有效,我对实施非常满意。但是我想将每个节点的引用存储到它的父节点。经过一些研究,我发现这篇文章描述了使用RefCellWeak结构的实现。

有了这些知识,我的计划是更新上面的示例。我的想法是我可以Box<...>Rc<RefCell<..>>. 我的想法是这些类型非常相似,因为它们都存储对某个数据结构的引用,唯一的区别是可以有多个Rc<RefCell<..>>' 指向该数据结构。我将我的实现更改为

但是这个更新的例子没有运行,说

我的例子是错误的,还是我对 rusts 还不太了解Rc<RefCell<_>>

带有上述示例的游乐场链接:https ://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=9929b2118e2430f03035da4c65a4cf2f

0 投票
0 回答
27 浏览

rust - Rust - 存储临时“上下文” - 生命周期与智能指针

我正在尝试学习 Rust,特别是生命周期和智能指针,并且想知道最生锈的方法。

具体来说,假设我们正在设计一种模拟语言和“分析器”:

让我们设计一些虚假的“内存节点”抽象

代码 内存节点
a=1 Node { name: "a", value: 4 }
b=2 Node { name: "b", value: 2 }
c=a Node { name: "c", value: 1 }
a=4 Node { name: "a", value: 4 }

注意:我们只希望存在三个内存节点,而不是像 AST 那样的四个内存节点

为了能够解析变量的值,我必须保持从名称到“内存节点”的上下文

为了保持我的分析器的 API 干净,我不想公开这个上下文。

假设我们的基础结构如下所示:

但是,我们不能在 Context 和 Root 中保留 Node 的副本。

一种方法是像Rc<RefCell<Node>>任何地方一样包装节点,这会使客户端 API 不整洁。理想情况下,我希望保持Root包含 Vec&Node作为公共 API。示例实现在这里https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=7ec7ecd29eea2626a11b90c829777e30

当我使用生命周期尝试此操作时,我得到一个我无法真正规避的错误 - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=5c5054872806b94a5b3a8ad4a75c1282

它给:

或者,如果可能的话,在不使用智能指针的情况下,还有哪些其他 Rusty 方法可以做到这一点?