问题标签 [immutability]

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 投票
5 回答
23659 浏览

objective-c - Objective-c“发送到不可变对象的变异方法”错误

我对objective-c 很陌生,并尝试为iphone 创建一个小应用程序。
除了这个小错误,我几乎完成了。实际上,我已经用谷歌搜索了几个小时以找到合适的解决方案,但不幸的是我无法找到有效的解决方案。
我在这里使用本教程来构建 UITableView:UITableView 教程 完整的错误消息如下所示:

* 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“* -[NSCFArray insertObject:atIndex:]: mutating method sent to immutable object”

这是数据控制器头文件:MyLinksDataController.h

和数据控制器方法:MyLinksDataController.m

-------------------------------稍后在源代码中-------------- --------------------

我非常感谢任何帮助。

提前感谢您的支持。

丹尼尔

0 投票
8 回答
6357 浏览

java - 可变类还是不可变类?

我在一些设计书籍中读到不可变类提高了可伸缩性,以及尽可能编写不可变类的良好实践。但我认为这样不可变的类会增加对象的增殖。那么使用不可变类或更好地使用静态类(所有方法都是静态的类)以提高可伸缩性是好事吗?

0 投票
5 回答
5461 浏览

c# - 不变性和 XML 序列化

一旦设置了初始值,我就有几个类是不可变的。Eric Lippert 将此称为一次写入不变性

在 C# 中实现一次写入不变性通常意味着通过构造函数设置初始值。这些值初始化只读字段。

但是,如果您需要使用 XmlSerializer 或 DataContractSerializer 将这样的类序列化为 XML,则必须有一个无参数的构造函数。

有没有人对如何解决这个问题有建议?还有其他形式的不变性可以更好地与序列化配合使用吗?

编辑:正如@Todd 指出的那样,DataContractSerializer 不需要无参数构造函数。根据MSDN 上的 DataContractSerializer 文档,DataContractSerializer“不会调用目标对象的构造函数”。

0 投票
3 回答
272 浏览

.net - 在 .NET 中使用 Hashtable 将指针映射到不可变对象

我有一个 Hashtable 对象,它用字符串“命名”或“映射”类中的各个字段

此类在运行时被修改,因此类型和大小都等于 2。

再往前走,我查询了我的 Hashtable,但值没有改变。我知道这是因为它们是不可变的。有没有办法可以指定我的 Hashtable 来保存指向我的类的字段的指针,而不是存储引用的值?

我知道我可以修改类 Interrupt 来保存自定义对象而不是原始 int,但它会涉及很多重构。

0 投票
4 回答
3749 浏览

functional-programming - 高效的不可变映射实现?

我想知道是否有一个地图的实现是:

  • Immutable,这样我就可以在函数式编程中使用它,并且毫不费力地确保事务和并发性。
  • 。我检查了二叉搜索树(RB,AVL)和尝试,但它们似乎都没有哈希表那么快。是否有支持恒定时间进行更新和检索的地图实现?(或至少非常快的对数时间)

简而言之,有没有一种功能数据结构可以在性能上与 Hash Maps 相提并论?

0 投票
10 回答
127647 浏览

c# - 在 C# 中替换多个字符串元素

有没有更好的方法来做到这一点...

我已经扩展了字符串类以将其保留为一项工作,但有更快的方法吗?


只是为了好玩(并停止评论中的论点),我提出了一个要点,对下面的各种示例进行基准测试。

https://gist.github.com/ChrisMcKee/5937656

正则表达式选项得分非常高;字典选项出现最快;stringbuilder replace 的冗长版本比简写略快。

0 投票
3 回答
400 浏览

c# - C#中对象的不可变属性

我正在寻找一种方法来对对象列表(可能的任何类型)进行排序,以便无论对象发生什么,只要它们没有被破坏,顺序保持不变(所以 hashCode 不是一个好主意因为在某些类中它会随着时间的推移而改变),因此我想使用内存中对象的地址,但我不确定这是否总是保持不变(地址是否可以通过垃圾收集调用改变实例?)。但是,我正在寻找对象(任何类型)的属性,只要对象没有被破坏,它们就会保持不变。有吗?如果是,它们是什么?

0 投票
3 回答
522 浏览

c++ - 如何修改不可变对象?

抱歉,我想不出这个问题的好标题...

在应用程序启动时,我通过数据库访问库从数据库加载对象,让我们调用它们的类CDbObject

在运行时,我收到与这些数据库对象中的状态更改相对应的消息。
我想最小化数据库访问,因此当它的状态改变时不重新加载完整的对象。
相反,我想包装 DB 对象并以某种方式使它们可修改。
我不能简单地派生一个类、实现一个setState()方法并创建该类的对象,因为我必须使用 DB 访问库给我的对象。这些对象没有实现复制机制,如果可能的话,我根本不想碰那个代码。

我可以创建一个包装类来存储指向 CDbObject 实例的指针,如下所示:

但明显的缺点是,我必须复制包装类的完整接口。
为了避免重复接口,我可以提供对包装对象的访问,但这使得包装器实际上毫无用处,因为如果用户不够谨慎,他可能会得到错误的状态。

有没有一种优雅的方式来完成我想要的?

编辑:

简而言之:我想让它对存储对象状态的用户透明。用户应通过调用一种方法获得当前状态。我希望这使它更清楚一点。

0 投票
1 回答
460 浏览

f# - 访问外部程序集中结构的公共只读成员

当我使用 F# 读取public readonlyC# 程序集中定义的结构类型的成员时,我遇到了一个奇怪的错误。

当我用 F# 1.9.6.16 编译 Client.exe 时,最后一行给出了错误:

在撰写本文时,网络是无用的。可以读取类的不可变成员,可以读取结构的可变成员,但不能读取结构的不可变成员,这似乎很奇怪。解决方法很简单,但我很好奇:这是编译器中的错误吗?

编辑:我向 fsbugs@microsoft.com 提交了错误报告

0 投票
3 回答
2031 浏览

python - 写时复制的纯功能数据结构?

我想拥有功能数据结构(可以共享结构的多个数据版本)的优势,但能够以命令式的方式对其进行修改。

我在想什么(以及可能的用途):一个 RPG 游戏,其中存储了整个游戏历史(例如,允许时光倒流)。使用写时复制,我可以简单地克隆保存游戏状态的结构并通过引入新回合来修改它 - 但可以访问早期的回合(不一定是所有回合,可能只是选择的游戏状态快照),没有每次都必须复制所有内容的惩罚。


假设foo是一张地图。

没有任何foo结构(例如,树)被复制。但是,从现在开始bar被视为副本,不允许任何更改传播回 `foo'。

现在

  • 创建了一个新对象,即baz.
  • bar被替换为新地图,持有新地图baz(可能保留一些foo's 结构)。
  • foo不受影响。

但如果我们这样做...

...baz可以只修改,因为我们有它的最新版本。bar 不需要改变。

foo所有这些都需要保存一些关于and的版本信息bar,在 上增加它foo.clone(),并以某种方式传递它baz(通过使其成为代理对象?)。

此外,已克隆的结构的任何部分都将成为“历史的一部分”并且不能再更改,这可以在运行时强制执行。


这有点类似于 JavaScript 的原型,但我更像是因为它允许更改向上传播。我认为它类似于版本控制系统。

  • 有没有做到这一点,做到什么程度?
  • 这是一个好主意吗?如果没有,有没有办法挽救它?
  • 如何实施?我正在考虑在一些高级 GC 语言(如 Python)之上构建它。