问题标签 [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.
objective-c - Objective-c“发送到不可变对象的变异方法”错误
我对objective-c 很陌生,并尝试为iphone 创建一个小应用程序。
除了这个小错误,我几乎完成了。实际上,我已经用谷歌搜索了几个小时以找到合适的解决方案,但不幸的是我无法找到有效的解决方案。
我在这里使用本教程来构建 UITableView:UITableView 教程
完整的错误消息如下所示:
* 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“* -[NSCFArray insertObject:atIndex:]: mutating method sent to immutable object”
这是数据控制器头文件:MyLinksDataController.h
和数据控制器方法:MyLinksDataController.m
-------------------------------稍后在源代码中-------------- --------------------
我非常感谢任何帮助。
提前感谢您的支持。
丹尼尔
java - 可变类还是不可变类?
我在一些设计书籍中读到不可变类提高了可伸缩性,以及尽可能编写不可变类的良好实践。但我认为这样不可变的类会增加对象的增殖。那么使用不可变类或更好地使用静态类(所有方法都是静态的类)以提高可伸缩性是好事吗?
c# - 不变性和 XML 序列化
一旦设置了初始值,我就有几个类是不可变的。Eric Lippert 将此称为一次写入不变性。
在 C# 中实现一次写入不变性通常意味着通过构造函数设置初始值。这些值初始化只读字段。
但是,如果您需要使用 XmlSerializer 或 DataContractSerializer 将这样的类序列化为 XML,则必须有一个无参数的构造函数。
有没有人对如何解决这个问题有建议?还有其他形式的不变性可以更好地与序列化配合使用吗?
编辑:正如@Todd 指出的那样,DataContractSerializer 不需要无参数构造函数。根据MSDN 上的 DataContractSerializer 文档,DataContractSerializer“不会调用目标对象的构造函数”。
.net - 在 .NET 中使用 Hashtable 将指针映射到不可变对象
我有一个 Hashtable 对象,它用字符串“命名”或“映射”类中的各个字段
此类在运行时被修改,因此类型和大小都等于 2。
再往前走,我查询了我的 Hashtable,但值没有改变。我知道这是因为它们是不可变的。有没有办法可以指定我的 Hashtable 来保存指向我的类的字段的指针,而不是存储引用的值?
我知道我可以修改类 Interrupt 来保存自定义对象而不是原始 int,但它会涉及很多重构。
functional-programming - 高效的不可变映射实现?
我想知道是否有一个地图的实现是:
- Immutable,这样我就可以在函数式编程中使用它,并且毫不费力地确保事务和并发性。
- 快。我检查了二叉搜索树(RB,AVL)和尝试,但它们似乎都没有哈希表那么快。是否有支持恒定时间进行更新和检索的地图实现?(或至少非常快的对数时间)
简而言之,有没有一种功能数据结构可以在性能上与 Hash Maps 相提并论?
c# - 在 C# 中替换多个字符串元素
有没有更好的方法来做到这一点...
我已经扩展了字符串类以将其保留为一项工作,但有更快的方法吗?
只是为了好玩(并停止评论中的论点),我提出了一个要点,对下面的各种示例进行基准测试。
正则表达式选项得分非常高;字典选项出现最快;stringbuilder replace 的冗长版本比简写略快。
c# - C#中对象的不可变属性
我正在寻找一种方法来对对象列表(可能的任何类型)进行排序,以便无论对象发生什么,只要它们没有被破坏,顺序保持不变(所以 hashCode 不是一个好主意因为在某些类中它会随着时间的推移而改变),因此我想使用内存中对象的地址,但我不确定这是否总是保持不变(地址是否可以通过垃圾收集调用改变实例?)。但是,我正在寻找对象(任何类型)的属性,只要对象没有被破坏,它们就会保持不变。有吗?如果是,它们是什么?
c++ - 如何修改不可变对象?
抱歉,我想不出这个问题的好标题...
在应用程序启动时,我通过数据库访问库从数据库加载对象,让我们调用它们的类CDbObject
。
在运行时,我收到与这些数据库对象中的状态更改相对应的消息。
我想最小化数据库访问,因此当它的状态改变时不重新加载完整的对象。
相反,我想包装 DB 对象并以某种方式使它们可修改。
我不能简单地派生一个类、实现一个setState()
方法并创建该类的对象,因为我必须使用 DB 访问库给我的对象。这些对象没有实现复制机制,如果可能的话,我根本不想碰那个代码。
我可以创建一个包装类来存储指向 CDbObject 实例的指针,如下所示:
但明显的缺点是,我必须复制包装类的完整接口。
为了避免重复接口,我可以提供对包装对象的访问,但这使得包装器实际上毫无用处,因为如果用户不够谨慎,他可能会得到错误的状态。
有没有一种优雅的方式来完成我想要的?
编辑:
简而言之:我想让它对存储对象状态的用户透明。用户应通过调用一种方法获得当前状态。我希望这使它更清楚一点。
f# - 访问外部程序集中结构的公共只读成员
当我使用 F# 读取public readonly
C# 程序集中定义的结构类型的成员时,我遇到了一个奇怪的错误。
当我用 F# 1.9.6.16 编译 Client.exe 时,最后一行给出了错误:
在撰写本文时,网络是无用的。可以读取类的不可变成员,可以读取结构的可变成员,但不能读取结构的不可变成员,这似乎很奇怪。解决方法很简单,但我很好奇:这是编译器中的错误吗?
编辑:我向 fsbugs@microsoft.com 提交了错误报告
python - 写时复制的纯功能数据结构?
我想拥有功能数据结构(可以共享结构的多个数据版本)的优势,但能够以命令式的方式对其进行修改。
我在想什么(以及可能的用途):一个 RPG 游戏,其中存储了整个游戏历史(例如,允许时光倒流)。使用写时复制,我可以简单地克隆保存游戏状态的结构并通过引入新回合来修改它 - 但可以访问早期的回合(不一定是所有回合,可能只是选择的游戏状态快照),没有每次都必须复制所有内容的惩罚。
假设foo
是一张地图。
没有任何foo
结构(例如,树)被复制。但是,从现在开始bar
被视为副本,不允许任何更改传播回 `foo'。
现在
- 创建了一个新对象,即
baz
. bar
被替换为新地图,持有新地图baz
(可能保留一些foo
's 结构)。foo
不受影响。
但如果我们这样做...
...baz
可以只修改,因为我们有它的最新版本。bar
不需要改变。
foo
所有这些都需要保存一些关于and的版本信息bar
,在 上增加它foo.clone()
,并以某种方式传递它baz
(通过使其成为代理对象?)。
此外,已克隆的结构的任何部分都将成为“历史的一部分”并且不能再更改,这可以在运行时强制执行。
这有点类似于 JavaScript 的原型,但我更像是因为它允许更改向上传播。我认为它类似于版本控制系统。
- 有没有做到这一点,做到什么程度?
- 这是一个好主意吗?如果没有,有没有办法挽救它?
- 如何实施?我正在考虑在一些高级 GC 语言(如 Python)之上构建它。