问题标签 [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.

0 投票
11 回答
7083 浏览

c# - 返回 IList与 C# 中的数组?

我最近问某人为什么他更喜欢返回强类型数组而不是 IList。我一直认为,面对一个生命周期很长的项目时,针对接口编程是最灵活、最好的编程方式。所以当他回答时,我感到很奇怪:

我们通常更喜欢不可变类型而不是可变类型。数组是不可变的。IList 不是。

我不完全确定我理解这个说法。任何人都可以帮助澄清这一点吗?

感谢你们提供的任何帮助。

0 投票
1 回答
8109 浏览

performance - Scala:可变对象与不可变对象性能 - OutOfMemoryError

我想比较 Scala 中 immutable.Map 和 mutable.Map 的性能特征以进行类似的操作(即将多个映射合并为一个映射。请参阅此问题)。对于可变映射和不可变映射,我似乎都有类似的实现(见下文)。

作为测试,我生成了一个包含 1,000,000 个单项 Map[Int, Int] 的列表,并将此列表传递给我正在测试的函数。有了足够的内存,结果并不令人惊讶:mutable.Map 约为 1200 毫秒,immutable.Map 约为 1800 毫秒,使用 mutable.Map 的命令式实现约为 750 毫秒——不确定是什么导致了巨大的差异,但请随意对此也发表评论。

让我有点吃惊的可能是因为我有点厚,在 IntelliJ 8.1 中的默认运行配置下,两个可变实现都遇到了 OutOfMemoryError,但不可变集合没有。不可变测试确实运行到完成,但运行速度非常慢——大约需要 28 秒。当我增加最大 JVM 内存(大约 200MB,不确定阈值在哪里)时,我得到了上面的结果。

无论如何,这是我真正想知道的:

为什么可变实现会耗尽内存,而不可变实现不会? 我怀疑不可变版本允许垃圾收集器在可变实现之前运行并释放内存——所有这些垃圾收集都解释了不可变低内存运行的缓慢——但我想要更详细的解释比起那个来说。

下面的实现。(注意:我并不是说这些是最好的实现。请随意提出改进建议。)

0 投票
1 回答
1197 浏览

scheme - “set!: not an identifier in:...” plt 方案错误

Dr.Scheme 中使用 Pretty Big 的这段代码有什么问题?我似乎记得过去做类似的事情没有问题。

返回以下错误:

set!: not an identifier in: (Frame-variables res)

如果我省略了(set! (Frame-variables res) ... )它工作正常的部分,当然我的列表实际上并没有改变。所以它识别第二个(Frame-varialbes res)而不是第一个?或者在这种情况下有什么处理set!

希望你认识到我有一个结构体Frame,它的variables字段是一个列表。

0 投票
3 回答
939 浏览

functional-programming - “价值限制”实际上是否意味着没有更高阶的函数式编程?

“价值限制”实际上是否意味着没有更高阶的函数式编程?

我有一个问题,每次我尝试做一些 HOP 时,都会遇到 VR 错误。例子:

我想知道这是 VR 的特定实现的问题,还是在类型系统中不包含突变的可变类型推断语言中没有解决方案的一般问题。

0 投票
2 回答
3820 浏览

iphone - NSMutableArray 无法添加到

我以前也遇到过这样的问题,并没有得到满意的答复。

我有一个带有名为“counties”的属性的视图控制器,它是一个 NSMutableArray。我将深入导航屏幕以查看有关选择县进行地理搜索的视图。因此,搜索页面深入到“选择县”页面。

NSMutableArray *counties当我将第二个控制器推入导航堆栈时,我传递给第二个控制器。实际上,我使用指向我的第一个控制器的“县”的指针设置了第二个控制器的“selectedCounties”属性(也是一个 NSMutableArray),如下所示。

但是,当我谈到addObject那个时,我得到了这个:

这是我的代码:

在 SearchViewController.h 中:

在 SearchViewController.m 中:

在 SearchLocationsViewController.h 中:

在 SearchLocationsViewController.m 中(这里的重点是,我们在选定县列表中切换表的每个元素是否处于活动状态):

我们死在[self.selectedCounties addObject....那儿。

现在,当我自己 NSLog 时[self.selectedCounties class],它告诉我这是一个 NSCFArray。

这是怎么发生的?我了解类捆绑包(或者我认为我还是这样做了),但这显然是一种特定类型,并且它在某些时候失去了它的子类化,从而杀死了整个事情。我只是完全不明白为什么会发生这种情况。

0 投票
4 回答
3589 浏览

design-patterns - 命令模式与访问者模式

允许访问者修改接收者的状态通常是可以接受的,还是应该改为命令模式?

0 投票
2 回答
1513 浏览

c++ - Objective C 和 C++ 中的可变性设计模式

最近为 iPhone 做了一些开发,我开始注意到一个有趣的设计模式,在 iPhone SDK 中使用了很多,关于对象可变性。

似乎典型的方法是定义一个不可变的类NSFoo,然后从中派生一个可变的后代NSMutableFoo。通常,NSFoo该类定义了数据成员、getter 和只读操作,派生的NSMutableFoo添加了 setter 和 mutating 操作。

由于对 C++ 更加熟悉,我不禁注意到这似乎与我在 C++ 中编写相同代码时所做的完全相反。虽然您当然可以采用这种方法,但在我看来,更简洁的方法是创建一个Foo类,将 getter 和只读操作标记为const函数,并在同一个类中实现可变操作和 setter。然后你会得到一个可变类,但是 typesFoo const*Foo const&都是不可变的等价物。

我想我的问题是,我对这种情况的看法有意义吗?我理解为什么 Objective-C 会做不同的事情,但是我错过了 C++ 中的二分类方法有什么优势吗?还是我完全错过了重点?

不是一个过于严肃的问题——更多的是出于我自己的好奇心。

0 投票
1 回答
132 浏览

class-design - 混合与分离类的可变性

在部分可变的类中,将可变字段与其不可变字段混合,还是创建一个封装它们的新类(或多个类)更好?这是我正在谈论的 C# 中的一个示例:

这是一个在其领域中具有混合可变性的实现:

还有一个具有单独的可变性:

和分离可变性实现:

我个人支持后一种风格。根据我的经验,并发场景中的状态操作产生的错误很难调试。随着并发成为程序的常态,本地化可变性似乎是减少调试工作的关键因素。在第二个例子中,我们不必查看整个类的实现来找出状态被操纵的地方。的全部SeparatedMutabilityBedroom可变性被本地化为RoomColor.

你怎么看?我是否忘记了一些需要考虑的要点?

0 投票
1 回答
423 浏览

f# - 捕获方面的可变与参考变量

我对 f# 中变量的肤浅理解表明,将变量声明为“可变”和使用“ref”变量基本上都做同样的事情。它们都是解决相同潜在问题的不同方法 - 在功能语言中有限且结构化地允许可变性,而不必求助于 IO Monad。我的理解已经“抽象”了存在技术差异。

  1. 如果是这种情况,为什么闭包不能捕获可变变量,但它们可以捕获 ref 实例?
  2. 更一般地说,允许这种差异的两种形式之间的技术差异是什么?
  3. 从语言设计的角度来看,引入两个可变快捷方式而不仅仅是一个的目的是什么?

如果这是一个多方,我很抱歉,但它们似乎都是相关的。

0 投票
5 回答
1478 浏览

c# - 可变类型的不可变视图

我有一个项目,我需要在执行流程之前构建大量配置数据。在配置阶段,将数据设置为可变非常方便。但是,一旦配置完成,我想将该数据的不可变视图传递给功能流程,因为该流程的许多计算将依赖于配置不变性(例如,基于预先计算事物的能力关于初始配置。)我想出了一个可能的解决方案,使用接口来公开只读视图,但我想知道是否有人遇到过这种方法的问题,或者是否有其他关于如何解决的建议解决这个问题。

我目前正在使用的模式的一个示例:


编辑

根据 Lippert 先生和 cdhowie 的意见,我整理了以下内容(删除了一些属性以简化):

FreezableList<T>如您所料,它是IList<T>. 这以一些额外的复杂性为代价获得了绝缘优势。