Tag: 不变性

为什么Matzselect使Ruby在默认情况下是可变的?

这是这个问题的反面: 为什么string不能在Java和.NET中变化? 在Ruby中做这个select只是因为操作(附加等)对可变string有效,还是有其他原因? (如果只是效率,那看起来很奇怪,因为Ruby的devise似乎不会高效地促进高效实现。)

不可变的numpy数组?

有没有一种简单的方法来创build一个不可变的NumPy数组? 如果必须从ndarray派生一个类来做到这一点,那么为了实现不可变性,必须重写的最小方法是什么?

不可变types:public final字段与getter

我需要一个小的容器类来存储一些应该是不可变的string。 由于string本身是一个不可改变的types,我想到了这样的事情: public final class Immu { public final String foo; public final String bar; public Immu(final String foo, final String bar) { this.foo = foo; this.bar = bar; } } 许多人似乎反对使用公共领域,而是使用Getters。 恕我直言,这只是在这种情况下的样板,因为string本身是不可变的。 其他的想法,我可能会错过这一个?

一个不可改变的types能改变它的内部状态吗?

问题很简单。 一个可以改变其内部状态而不从外部观察的types可以被认为是不可变的吗? 简单的例子: public struct Matrix { bool determinantEvaluated; double determinant; public double Determinant { get //asume thread-safe correctness in implementation of the getter { if (!determinantEvaluated) { determinant = getDeterminant(this); determinantEvaluated = true; } return determinant; } } } 更新 :澄清线程安全问题,因为它是造成分心。

C#和不变性和只读字段…一个谎言?

我发现人们声称,在类中使用所有只读字段并不一定会使该类的实例不可变,因为即使在初始化(构造)之后,也有“方法”更改只读字段值。 怎么样? 什么方法? 所以我的问题是什么时候我们真的可以在C#中有一个“真正的”不可变的对象,我可以安全地在线程中使用? 也做匿名types创build不可变的对象? 有人说LINQ在内部使用不可变对象。 究竟如何?

.NET中的System.String.Copy有什么用?

恐怕这是一个非常愚蠢的问题,但我一定会错过一些东西。 为什么要用String.Copy(string) ? 文档说明了这个方法 使用与指定的String相同的值创buildString的新实例。 由于string在.NET中是不可变的,所以我不确定使用这种方法有什么好处,就像我想的那样 string copy = String.Copy(otherString); 对于所有的实际目的,似乎都会产生同样的结果 string copy = otherString; 也就是说,除了正在进行的内部簿记之外,以及事实上副本不是ReferenceEquals到otherString,没有可观察到的差异 – string是一个不可变的类,其相等性基于值而不是标识。 (感谢@Andrew Hare指出,我原来的措辞不够精确,不足以表明我意识到Copy和非Copy之间存在差异,但担心感觉缺乏有用的差异。) 当然,当传递一个null参数时,Copy抛出一个ArgumentNullException ,并且“新实例”可能消耗更多的内存。 后者似乎不是一个好处,我不确定这个空检查是一个足够大的奖金,以保证整个Copy方法。 谢谢。

C#中不可变的对象模式 – 你怎么看?

我已经在几个项目的过程中开发了一个创build不可变(只读)对象和不可变对象图的模式。 不可变对象具有100%线程安全的优点,因此可以跨线程重用。 在我的工作中,我经常在Web应用程序中使用这种模式来configuration设置,以及在内存中加载和caching的其他对象。 caching对象应该永远是不可变的,因为你想保证它们不会意外地改变。 现在,您可以轻松devise不可变对象,如下例所示: public class SampleElement { private Guid id; private string name; public SampleElement(Guid id, string name) { this.id = id; this.name = name; } public Guid Id { get { return id; } } public string Name { get { return name; } } } 这对于简单的类来说很好 – 但对于更复杂的类,我并不喜欢通过构造函数传递所有值的概念。 让属性上的setter更合乎需要,构造新对象的代码变得更容易阅读。 那么如何用setter创build不可变的对象呢? 那么,在我的模式中,对象首先是完全可变的,直到你用一个方法调用来冻结它们。 […]

Elixirvariables真的是不可变的吗?

在戴夫·托马斯(Dave Thomas)的“编程药剂”(Programming Elixir)一书中,他指出:“药剂执行不变数据”,并继续说: 在Elixir中,一旦一个variables引用了一个如[1,2,3]的列表,就知道它总是引用那些相同的值(直到重新绑定variables)。 这听起来像“它不会改变,除非你改变它”,所以我很困惑,可变性和重新绑定之间的区别是什么。 突出显示差异的例子将会非常有帮助。

什么评论“frozen_string_literal:true”呢?

这是我的项目目录中的rspec binstub。 #!/usr/bin/env ruby begin load File.expand_path("../spring", __FILE__) rescue LoadError end # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'rspec' is installed as part of a gem, and # this file is here to facilitate running it. # require "pathname" ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", Pathname.new(__FILE__).realpath) require "rubygems" require "bundler/setup" […]

公共只读字段用于不可变的结构是否工作?

这是一个正确的方式来声明不可变的结构? public struct Pair { public readonly int x; public readonly int y; // Constructor and stuff } 我想不出为什么会遇到问题,但我只是想问一下。 在这个例子中,我使用了整数。 如果我使用了一个类,但是这个类也是不可变的,像这样呢? 那应该也可以,对不对? public struct Pair { public readonly (immutableClass) x; public readonly (immutableClass) y; // Constructor and stuff } (另外:我明白,使用属性是更通用的,并允许更改,但是这个结构的意图只是存储两个值,我只是对这个不变性问题感兴趣。