问题标签 [interior-mutability]
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.
rust - 具有内部可变性的单元格允许任意突变动作
标准Cell结构提供内部可变性,但只允许一些突变方法,例如 set()、swap() 和 replace()。所有这些方法都会改变 Cell 的全部内容。但是,有时需要进行更具体的操作,例如,仅更改单元格中包含的部分数据。
所以我尝试实现某种通用单元格,允许任意数据操作。操作由用户定义的闭包表示,该闭包接受单个参数 - &mut 对 Cell 内部数据的引用,因此用户自己可以决定如何处理 Cell 内部。下面的代码演示了这个想法:
但是,我对代码有些担心。
它是否安全,即一些安全但恶意的关闭是否可以通过使用这个“通用”单元来打破 Rust 的可变性/借用/生命周期规则?我认为它是安全的,因为内部引用参数的生命周期禁止其在闭包调用时间之外的公开。但我仍然有疑问(我是 Rust 的新手)。
也许我正在重新发明轮子,并且存在一些解决问题的模板或技术?
注意:我在这里发布了这个问题(不是在代码审查中),因为它似乎与语言而不是代码本身(仅代表一个概念)更相关。
[编辑] 我希望零成本抽象没有运行时失败的可能性,所以 RefCell 不是完美的解决方案。
generics - 如何在 Rust 中使用泛型类型的内部可变性?
我想在 Rust 中设计一个结构,它可以用实现Digest
特征的对象构造,并抽象方法背后的哈希行为。这是一个无法编译的简单示例:
这无法编译,因为self
在方法签名中不可变地借用,所以self.digest
不能不可变地借用。因此,它尝试复制它,但是由于D
没有将泛型定义为遵循该Copy
特征,因此它失败了。
无论如何,我宁愿不复制它。我宁愿有一个实例。我尝试过的一些事情:
更改要采用的方法签名
mut self
。但这会将对象的所有权转移到方法中,之后就不能再使用它了。digest
将字段包装在RefMut
orCell
中,以采用内部可变性,但我无法找出正确的方法来借用可digest
变性而不尝试复制值。此外,如果可能,希望在编译时保留借用检查。将 of 的类型更改为
D
返回 a 实例的函数Digest
,并使用它在方法内实例化一个新的摘要hash()
。但是,即使我将其定义为D: Box<dyn Digest>
,编译器也会抱怨the value of the associated type OutputSize (from trait digest::Digest) must be specified
. 所以这看起来很有挑战性,因为我想支持不同的哈希算法,这些算法会产生不同大小的哈希值。
我试图使用泛型来获得 trait bound 的编译时优势,但不得不承认,在与行为需要可变性的对象组合时,内部可变性的挑战阻碍了我。非常感谢指向这个设计挑战的惯用 Rust 解决方案的指针。
奖励 - 我如何避免to_vec()
复制并只返回由返回的数组finalize_reset()
?
rust - “不能返回引用临时值的值”和 Rust 中的内部可变性
我在 Rust 中有以下代码:
regexp 是惰性计算的,因此使用捕获&mut self
i 不想要RefCell
的。
我收到以下消息:
编译器消息似乎很清楚:Ref
由borrow()
外部临时创建并返回。但是我相信Option
( self.regexp_data
) 归RefCell
结构本身所有,因此在内部使用它应该没问题(因为函数不是pub
)。
我还尝试了以下方法(但失败并显示相同的消息)
我该如何解决?