问题标签 [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 投票
1 回答
463 浏览

python - 解释这种不一致

这里有两种方法。一个修改变量 x,另一个不修改。你能解释一下这是为什么吗?

0 投票
1 回答
111 浏览

python - 理解 Python 中的可变性

我有这个片段:

和这个:

的初始化如何b在决定 的可变性方面发挥作用a

0 投票
5 回答
2271 浏览

scala - Scala中有没有办法删除可变变量,或者在以下情况下保留可变变量很好?

我了解 Scala 完全包含不变性。

现在我在想一个场景,我必须在一个类等中保持一些状态(通过变量)。稍后我需要更新这些变量;然后我可以稍后重新访问该类以访问更新的变量。

我将尝试通过一个非常简单的示例使其变得简单:

……

所以你看,我需要不断改变 x 并得到结果。如果您认为我可以简单地将 x 作为计算的参数,例如

这是个好主意,但在我的情况下我不能这样做,因为我需要将 x 的设置值分开并完全计算结果。换句话说,设置 x 值不应该触发“计算”发生,相反,我需要能够在程序中随时设置 x 值,并且能够在程序中的任何其他时间重用该值进行计算,当我需要它时.

在这种情况下,我使用了一个变量 (var x: Int)。这是合法的还是仍然有一些不可变的方法来处理它?

0 投票
1 回答
210 浏览

multithreading - CUDA,不变性与可变性

我坚信尽可能使用不变性,这样多线程程序就不需要经典同步。这是函数式语言中使用的核心概念之一。

我想知道人们对 CUDA 程序的看法,我知道为 GPU 开发不同于为 CPU 开发并且作为 GPU n00b 我希望更多知识渊博的人就手头的问题给我他们的意见。

谢谢,加布里埃尔

0 投票
2 回答
914 浏览

types - OCaml 可变变体类型

Caml Light 手册在第 37 页提到了可变变体类型:

但是这个扩展似乎不是 OCaml 的一部分,或者是吗?在 OCaml 中定义可变变体类型的唯一方法是使用可变记录或数组,我对吗?

编辑:感谢@gasche 建议使用 refs,这是可变记录的快捷方式:

0 投票
3 回答
1090 浏览

c# - Why use readonly IEnumerable

Why would you declare an IEnumerable<T> readonly?

From the this article on async & await we have the following code.

IEnumerable<T> is immutable. How is this different from the readonly keyword?

0 投票
2 回答
1446 浏览

variables - 在球拍中分配变量(变量突变)

我有以下给定表达式的函数,执行它:

如果我执行以下操作:

我想让 display(x) 显示 18。基本上,如何将给定表达式的值分配回给定变量?

0 投票
1 回答
134 浏览

scala - Scala:索引序列的可变性以及转换为可变和返回时会发生什么

我最近多次遇到这种情况:

  1. 一个类有一个不可变的(索引的?)序列成员
  2. 工厂成员方法创建一个新实例,其序列有所修改

有什么有效的方法来做到这一点?

我这样做 .toArray 以便我可以修改这个序列和 .clone 因为我担心如果原始 xs 已经是一个数组,toArray 将只返回这个,我将修改对象(意味着是不可变的) 值。但是,如果 xs 不是数组,这显然会产生两个副本,我真的很想避免这种情况。显然,我可以只检查它的类型,但这似乎很不雅,我不太确定是否必须检查其他可以包装数组的可变序列。做什么?

0 投票
1 回答
113 浏览

cocoa - 使用可变数组检索保存到 NSUserDefaults 的数组并更改值

从返回的值NSUserDefaults是不可变的,即使您将可变对象设置为值。

有一个问题让我感到困惑。

我将一个NSArray(不可变的)保存到用户默认值中setObject:forKey:,然后同步。

我删除了保存代码,并使用 anNSMutableArray来获取我保存的值,通过objectForKey:

我对可变数组做了一些可变操作。我[[userDefaults standardUserDefaults] objectForKey:]用来检索数组,它被我的操作改变了,我同步了。

但是当我再次运行程序时,数组并没有改变!

我可以使用可变类来接收不可变类吗?它可以更改,并出现在内存中,并且从用户默认值中检索的值也已更改。我不知道为什么。我同步了,但是 plist 文件没有改变。我不知道为什么。

代码:

安慰:

0 投票
4 回答
724 浏览

f# - 可变值和不可变值重定义有什么区别?

我读过 F# 中的值是不可变的。但是,我也遇到了重新定义值定义的概念,它影响了之前的定义。这与可变值有何不同?我问这不仅仅是作为一个理论结构,而且是否有任何关于何时使用可变值以及何时重新定义表达式的建议;或者如果有人可以指出后者不是惯用的 f#。

重新定义的基本示例:

更新1:

添加到下面的答案中,Fsharp interactive 在顶层的重新定义只允许在不同的终端中。以下内容也会在 fsi 中引发错误:

另一方面,在 let 绑定中允许重新定义。

更新 2:实际差异,闭包不能与可变变量一起使用:

更新 3:

虽然我可以使用 refs 对副作用进行建模,例如:

除了使用闭包的差异之外,我看不出重定义和使用 mutable 关键字之间的实际差异,例如:

对比

另一个思路:我不确定如何使用线程,但是(a)另一个线程可以在 let 绑定中改变可变变量的值,并且(b)另一个线程可以在一个中重新绑定/重新定义一个值名称让绑定。我当然在这里遗漏了一些东西。

更新 4:最后一种情况的不同之处在于,突变仍然会发生在嵌套范围内,而嵌套范围内的重新定义/重新绑定将从外部范围“隐藏”定义。

对比