问题标签 [mutable]

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 投票
4 回答
1032 浏览

java - 如何限制对可变或不可变方法的访问?

在一个新的 Java 项目中,我尝试应用尽可能多的最佳实践。我遇到的问题是不变性。虽然我理解了这个概念并且已经构建了一些不可变类,但我现在来到了一个我认为将它作为可变类来做更合适的类。

主要问题是我想在某些情况下隐藏类的可变部分,以便在我的情况下 MVC 的视图层不能直接修改对象,但必须通过其控制器。

我想到了两种方法:

  1. 创建一个包含所有不可变方法的接口“Thing”(只读)并创建一个包含设置器的接口“MutableThing”。

  2. 将所有方法放在一个接口中,并通过像 Collections.unmodifiableList(obj) 方法一样包装对象来限制对变异方法的访问,以便在访问变异方法时抛出异常。

我更喜欢第一个,因为我认为它更干净,设计得更好,但我有一个问题。我在“事物”接口中有 addListener(l) 和 removeListener(l),因此视图层可以将自己注册为某些模型对象的侦听器。但是在“Thing”接口中使用这两种方法,它本身就没有意义了。如果没有实际更改数据的方法,为什么接口能够注册通知数据更改的侦听器?我可以将这些方法放在“MutableThing”接口中,但视图层只能访问“Thing”接口,不能将自己注册为监听器。

这不起作用的原因仅仅是因为侦听器,视图层实际上是否负责将自己注册为模型上的侦听器?如果控制器可以以某种方式做到这一点(它可以访问“MutableThing”),那么就不会有问题,但我不知道如何实现它。

你有什么建议?

谢谢!

0 投票
3 回答
1738 浏览

functional-programming - OCaml 中的可变数据

我在 OCaml 中创建了一个可变数据结构,但是当我访问它时,它给出了一个奇怪的错误,

这是我的代码

当我在 ocaml 顶层执行此操作时

然后尝试做x.size我得到这个错误

什么似乎是问题?我不明白为什么这不起作用。

谢谢,费萨尔

0 投票
4 回答
801 浏览

c# - 有什么方法可以在 C# 中创建从不可变对象派生的可变对象?

我有兴趣制作一个具有无法修改的属性的不可变类,以及一个派生自它的可变类。这些对象将是表示数据库记录的简单数据对象,因此它们的属性只有不可变的值。

我的目标是让我的数据访问层正常创建对象的可变版本,方法是根据数据库值设置属性,但将这些对象的只读版本传递回应用程序。(如果开发人员真的想要,代码可以将不可变对象显式转换回可变对象,我对此感到满意。)

我可以这样做很丑(这是一个词吗?),使用 getter 和 setter 的方法,并为可变类提供一个公共的新 setter:

如果可能的话,我更喜欢使用自动属性——调试时它们会更好。除此之外,我并不真正关心代码的外观,因为它只是来自代码生成器并且永远不会被查看。

有任何想法吗?

0 投票
3 回答
2793 浏览

iphone - 将 NSArray 与 Monotouch 一起使用

如何在 C# (Monotouch) 中将项目插入 NSArray 对象?我没有找到合适的方法吗?在 Objective-C 方面,有一个名为“initWithObjects”的构造函数,但我在 C# 方面没有找到它。

绒球

0 投票
2 回答
638 浏览

f# - 您如何将这棵可变树转换为不可变树?

如何将类型 Node 转换为不可变树?

这个类实现了一个不允许重叠或相邻范围的范围树,而是将它们连接起来。例如,如果根节点是{min = 10; max = 20}右子节点,并且其所有孙节点的最小值和最大值必须大于 21。范围的最大值必须大于或等于最小值。我包含了一个测试功能,因此您可以按原样运行它,它会转储任何失败的案例。

我建议从 Insert 方法开始阅读这段代码。

Range 的测试用例


这不是一个答案。

我调整了我的测试用例来运行 Juliet 的代码。它在许多情况下都失败了,但是我确实看到它通过了一些测试。

0 投票
3 回答
239 浏览

python - 附加到列表实例的对象出现在该列表的不同实例中

我正在编写这段小代码作为面向对象编程的练习。

在这里,我试图将房屋定义为房间列表,并将每个房间定义为设备列表(例如灯)。

首先,我创建了所有对象,它们将两个房间附加到房子上,并将不同的设备附加到每个房间。很基本。

问题是该设备似乎被附加到两个房间。这是为什么?

编码:

和输出。

请注意,d1 的同一个实例在两个房间 r1 和 r2 中。

0 投票
5 回答
1112 浏览

python - 在 Python 中创建 N*N*N 列表的问题

我正在尝试在 Python 中创建一个 3 维 N N N 列表,如下所示:

不幸的是,这似乎并没有正确地“克隆”列表,因为我认为它会:

我在这里做错了什么?

0 投票
1 回答
292 浏览

algorithm - 一种用可变或不可变状态替换序列中出现的有效技术

我正在寻找一种有效的技术来Op查找Seq[Op]. 找到一个事件后,我想用定义的替换替换该事件并再次运行相同的搜索,直到列表停止更改。

设想:

我有三种类型的Op案例类。Pop()延伸OpPush()延伸OpNop()延伸Op。我想用 替换Push(), Pop()出现Nop()。基本上代码可能看起来像seq.replace(Push() ~ Pop() ~> Nop()).

问题:

既然我打电话,seq.replace(...)我将不得不在序列中搜索Push(), Pop(). 到现在为止还挺好。我发现了这种情况。但现在我将不得不从列表中拼接出现并插入替换。

现在有两种选择。我的列表可能是可变的或不可变的。如果我使用不可变列表,我会担心性能,因为这些序列的大小通常为 500 多个元素。如果我替换了很多事件,A ~ B ~ C ~> D ~ E如果我没记错的话,我会创建很多新对象。但是,我也可以使用可变序列,例如ListBuffer[Op].

基本上从链表背景来看,我只需做一些指针弯曲,在总共四次操作之后,我完成了替换而不创建新对象。这就是为什么我现在关心性能。特别是因为这对我来说是一个性能关键的操作。

问题:

您将如何replace()以 Scala 方式实现该方法,以及您将使用哪种数据结构,记住这是一个性能关键操作?

我很高兴答案指出我正确的方向或伪代码。无需编写完全替换方法。

谢谢你。

0 投票
3 回答
2268 浏览

objective-c - Cocoa:测试一个 NSString 是不可变的还是可变的?

这会产生一个不可变的字符串对象:

这会产生一个可变的字符串对象:

但是这两个对象都被报告为同一种对象,“NSCFString”:

那么是什么在内部区分这些对象,以及如何测试它,以便在对它做坏事之前轻松确定一个神秘的字符串变量是不可变的还是可变的?

0 投票
4 回答
3583 浏览

data-structures - 如何从scala中的文件中读取不可变数据结构

我有一个由作业组成的数据结构,每个作业都包含一组任务。Job 和 Task 数据都在如下文件中定义:

创建对象的过程如下:
- 读取每个作业,创建并通过 id 存储
- 读取任务,通过 id 检索作业,创建任务,将任务存储在作业中

一旦文件被读取,这个数据结构就永远不会被修改。所以我希望工作中的任务将存储在一个不可变的集合中。但我不知道如何以有效的方式做到这一点。(注意:不可变的地图存储作业可能是不可变的)

这是代码的简化版本:

提前感谢您的每一个建议!