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

delphi - Delphi字符串是不可变的吗?

据我所知,字符串在 Delphi 中是不可变的。我有点理解这意味着如果你这样做:

第一个字符串被销毁,您将获得对新字符串“Hello World”的引用。

但是,如果您在代码周围的不同位置有相同的字符串,会发生什么?

我分配了一个字符串哈希来标识多个变量,例如,“更改”由该更改的属性的哈希值标识。这样我就很容易检查“更改”是否相等。

现在,每个散列都是单独计算的(并非所有属性都被考虑在内,因此即使实例在某些值上不同,它们也可以相等)。

问题是,Delphi 如何处理这些字符串?如果我计算将散列分隔为相同的 10 字节长度字符串,我会得到什么?两个 10 字节的内存块还是对同一个内存块的两个引用?

澄清:更改由从数据库读取的一些属性组成,并由单个线程生成。TChange 类有一个 GetHash 方法,该方法根据字符串中的某些值(但不是全部)计算哈希值。现在,其他线程收到更改并且必须将其与先前处理的更改进行比较,以便它们不会处理相同的(逻辑)更改。因此散列,并且由于它们具有单独的实例,因此计算了两个不同的字符串。我正在尝试确定从字符串更改为 128 位哈希之类的东西是否是一个真正的改进,否则只会浪费我的时间。

编辑:Delphi 的版本是 Delphi 7.0

0 投票
4 回答
459 浏览

.net - System.Numerics.BigInteger 会是不可变的吗?应该是吗?

.net framework 4 显然将包含一个 BigInteger 类。但是,我似乎无法确定它是否是不可变的。我似乎也无法决定这是否是一件好事。

不变性有很多好处,尤其是对于像 big-int 这样“类似价值”的东西。另一方面,基本操作必须高效才能使 PowerMod 等高成本操作尽可能快。就地添加将比不可变添加更快。我目前倾向于将不变性作为库类的更好选择(想想 String)。

有谁知道它是否是不可变的?你认为它应该是不可变的吗?

0 投票
5 回答
1658 浏览

python - 如何在我的课堂上赋予字符串性?

我想要一个带有一个附加属性的字符串,让我们说是用红色还是绿色打印它。

Subclassing(str) 不起作用,因为它是不可变的。我看到了它的价值,但它可能很烦人。

多重继承有帮助吗?我从来没有用过那个。

仅继承对象并使用 self.value=str 意味着我必须自己实现所有字符串消息(如 strip)。

或者有没有办法转发它们,比如Ruby的missing_method?

我认为使用按实例索引的类级字典来存储颜色是可行的。太丑了?

0 投票
8 回答
1113 浏览

c# - C# / C++ 中的缓存或预先计算的不可变函数

通过“不可变函数”或“不可变方法”,我的意思是一个函数,如果你给它相同的参数,它的结果永远不会改变。

当您想缓存不可变函数的预计算值时,我很想知道是否有人知道更通用或更简洁的解决方案。

让我用一个简单的例子来解释我的意思:

注意:
- 我添加了标签 C++ 作为 C++ 中的解决方案,我也会感兴趣
- “不可变函数”的概念对于数据库开发人员来说很常见,因为函数可以定义为“不可变”或“在事务中不可变”(这是提高查询性能的好方法)。

提前致谢

0 投票
4 回答
5687 浏览

python - 扩展 Python 的内置 Str

我正在尝试子类化str,但由于它的不变性而遇到了一些困难。

对于不需要任何新功能的继承方法,例如derived.lower(),是否有一种简单的 Pythonic 方法来返回类型对象DerivedClass(而不是str)?或者我是否像以前那样手动覆盖每个 str.method() derived.upper()

编辑:

0 投票
9 回答
63567 浏览

functional-programming - 无状态编程的优点?

我最近一直在学习函数式编程(特别是 Haskell,但我也阅读了有关 Lisp 和 Erlang 的教程)。虽然我发现这些概念很有启发性,但我仍然看不到“无副作用”概念的实际方面。它的实际优势是什么?我试图以函数式思维方式思考,但有些情况似乎过于复杂,无法以简单的方式保存状态(我不认为 Haskell 的 monads '容易')。

是否值得继续深入学习 Haskell(或另一种纯函数式语言)?函数式编程或无状态编程实际上比程序式编程更有效率吗?以后有可能我会继续使用 Haskell 或其他函数式语言,还是应该只是为了理解而学习它?

我关心的不是性能而是生产力。所以我主要是问我是否会比使用过程/面向对象/其他语言更高效。

0 投票
7 回答
11804 浏览

c# - C#中的常量字典

我在 C# 中有一个包含字典的类,只要包含它的类存在,我想创建它并确保从该字典中添加、编辑或删除任何内容。

readonly 并没有真正帮助,一旦我测试并看到我可以在之后添加项目。例如,我创建了一个示例:

我希望 Add 方法不起作用。如果可能的话,我希望它甚至不编译。有什么建议么?

实际上,我很担心它是开放给很多人更改的代码。因此,即使我隐藏了 Add 方法,也有可能有人“无辜地”创建一个添加密钥或删除另一个密钥的方法。我希望人们查看并知道他们不应该以任何方式更改字典。就像我使用 const 变量一样。

0 投票
3 回答
1569 浏览

wpf - 如何在不复制代码的情况下在 WPF 中编辑不可变对象?

我们的领域模型中有很多不可变的值对象,其中一个例子是位置,由纬度、经度和高度定义。

允许编辑位置的明显方法是构建一个具有 gettersetter 的 ViewModel,以及一个 ToPosition() 方法来提取经过验证的不可变位置实例。虽然这个解决方案没问题,但它会导致大量重复代码,尤其是 XAML。

所讨论的值对象由三到五个属性组成,这些属性通常是 X、Y、Z 和一些辅助材料的变体。鉴于此,我曾考虑创建三个 ViewModel 来处理各种可能性,其中每个 ViewModel 都需要为每个属性的值公开属性以及为每个标签显示的描述(例如“纬度”)。

更进一步,似乎我可以将其简化为一个通用的 ViewModel,它可以处理 N 个属性并使用反射将所有内容连接起来。类似于属性网格的东西,但用于不可变对象。属性网格的一个问题是我希望能够更改外观,以便拥有标签和文本框,例如:

或将其放在 DataGrid 中,例如:

所以我的问题是:

你能想出一个优雅的方法来解决这个问题吗?有没有这样做的图书馆或关于类似事情的文章?

我主要在寻找:

  • 尽量减少代码重复
  • 易于添加新的值对象类型
  • 可以通过某种验证进行扩展
0 投票
12 回答
12445 浏览

c# - 根据定义,值类型是不可变的吗?

我经常读到structs 应该是不可变的——它们不是根据定义吗?

你认为int是不可变的吗?

似乎没问题 - 我们得到一个新的int并将其分配回i. 那这个呢?

好的,我们可以将其视为一条捷径。

struct Point

这真的改变了观点(1, 2)吗?Point.Offset()我们不应该将其视为返回新点的以下快捷方式吗?

这个想法的背景是这样的——一个没有身份的值类型怎么可能是可变的?您必须至少查看两次才能确定它是否发生了变化。但是,如果没有身份,你怎么能做到这一点呢?

我不想通过考虑ref参数和装箱来使推理复杂化。我也知道p = p.Offset(3, 4);表达不变性要好得多p.Offset(3, 4);。但问题仍然存在——值类型在定义上不是不可变的吗?

更新

我认为至少涉及两个概念——变量或字段的可变性和变量值的可变性。

在示例中,我们必须字段 - 一个可变字段和一个不可变字段。因为值类型字段包含整个值,所以存储在不可变字段中的值类型也必须是不可变的。我仍然对结果感到非常惊讶——我没有期望 readonly 字段保持不变。

变量(除了常量)总是可变的,因此它们对值类型的可变性没有限制。


答案似乎不是那么直截了当,所以我将重新表述这个问题。

鉴于以下。

你能给出一个完整的版本Foo和一个使用例子 - 可能包括ref参数和装箱 - 这样就不可能重写所有出现的

0 投票
4 回答
2667 浏览

c# - 并行应用程序的可变与不可变

在我正在编写的应用程序中,我需要编写许多基本类型,它们很可能是不可变的。但我想知道如何将并行应用程序中的可变类型与不可变类型进行比较。

您可以对可变对象使用锁,对吗?它与并行应用程序中使用不可变类型的其他技术相比如何?

你至少远离使用不可变类型的锁,对吧?