Questions tagged «immutability»

不变性是指数据创建后无法修改。而是通过复制数据进行修改。不变数据的一个特性是它是“参照透明的”。




17
什么是不变的?
这可能是有史以来最愚蠢的问题,但我认为对于Java新手来说这很令人困惑。 有人可以澄清什么是不变的吗? 为什么是String一成不变的? 不可变对象的优缺点是什么? 为什么诸如StringBuilderString之类的可变对象优先于String,反之亦然? 一个很好的例子(在Java中)将不胜感激。

15
Java字符串真的不可变吗?
我们都知道这String在Java 中是不可变的,但是请检查以下代码: String s1 = "Hello World"; String s2 = "Hello World"; String s3 = s1.substring(6); System.out.println(s1); // Hello World System.out.println(s2); // Hello World System.out.println(s3); // World Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] value = (char[])field.get(s1); value[6] = 'J'; value[7] = 'a'; value[8] = 'v'; value[9] = 'a'; value[10] = …

17
JavaScript中的常量:什么时候使用它,有必要吗?
我最近遇到过constJavaScript中的关键字。据我所知,它用于创建不可变变量,并且我已进行测试以确保不能重新定义它(在Node.js中): const x = 'const'; const x = 'not-const'; // Will give an error: 'constant 'x' has already been defined' 我意识到它尚未在所有浏览器中标准化-但是我只对Node.js V8的上下文感兴趣,而且我注意到,某些开发人员/项目似乎可以在将var关键字用于同样的效果。 所以我的问题是: 什么时候可以const代替var? 是否应该在每次声明一个不会被重新分配的变量时使用它? 如果var使用它代替, const反之亦然吗?

30
在不可变集合上使用不变异的“添加”方法的最佳名称是什么?
对不起,标题太小了-如果我能拿出一个简洁的标题,则不必提这个问题。 假设我有一个不变的列表类型。它具有一个操作Foo(x),该操作返回一个新的不可变列表,该列表以指定的参数作为结尾的额外元素。因此,要构建具有值“ Hello”,“ immutable”,“ world”的字符串列表,您可以编写: var empty = new ImmutableList<string>(); var list1 = empty.Foo("Hello"); var list2 = list1.Foo("immutable"); var list3 = list2.Foo("word"); (这是C#代码,如果您觉得语言很重要,那么我对C#建议最感兴趣。从根本上讲,这不是语言问题,但语言的成语可能很重要。) 重要的是现有列表不会被更改Foo-因此empty.Count仍将返回0。 达到最终结果的另一种(更惯用的)方法是: var list = new ImmutableList<string>().Foo("Hello") .Foo("immutable") .Foo("word"); 我的问题是:Foo的最佳名字是什么? 编辑3:正如我稍后会透露的那样,类型的名称实际上可能不是ImmutableList<T>,这使位置很明确。而是想象TestSuite它是不可变的,因为它所包含的整个框架都是不可变的... (编辑结束3) 到目前为止,我已经提出的选项: Add:.NET中常见,但表示原始列表已更改 Cons:我相信这是功能语言中的正常名称,但对没有使用这些语言经验的人来说毫无意义 Plus:到目前为止,我最喜欢的这并不意味着对我有所改变。显然,这在Haskell中也使用过,但期望值稍有不同(Haskell程序员可能希望它将两个列表加在一起,而不是将一个值添加到另一个列表中)。 With:与其他一些不可变的约定一致,但与IMO的“附加性”并不完全相同。 And:不是很描述。 +的运算符重载:我真的不是很喜欢。我通常认为运算符应仅应用于较低级别的类型。我愿意被说服! 我要选择的标准是: 给出方法调用结果的正确印象(即它是带有额外元素的原始列表) 尽可能清楚地表明它不会对现有列表进行变异 如上面的第二个示例中所述,当链接在一起时听起来很合理 如果我不够清晰,请询问更多详细信息... 编辑1:这是我倾向于Plus的原因Add。考虑以下两行代码: list.Add(foo); list.Plus(foo); …

3
评论“ 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) …

26
Java中字符串的不变性
考虑以下示例。 String str = new String(); str = "Hello"; System.out.println(str); //Prints Hello str = "Help!"; System.out.println(str); //Prints Help! 现在,在Java中,String对象是不可变的。然后如何为对象str分配值“帮助!”。这是否与Java中字符串的不变性相矛盾?有人可以向我解释不变性的确切概念吗? 编辑: 好。我现在明白了,但只是一个后续问题。那么下面的代码呢: String str = "Mississippi"; System.out.println(str); // prints Mississippi str = str.replace("i", "!"); System.out.println(str); // prints M!ss!ss!pp! 这是否意味着将再次创建两个对象(“密西西比”和“ M!ss!ss!pp!”),并且引用str在replace()方法之后指向另一个对象?


11
为什么不变性在JavaScript中如此重要(或需要)?
我目前正在研究React JS和React Native框架。在阅读关于Facebook的Flux和Redux实现的文章时,我遇到了Immutability或Immutable-JS库。 问题是,为什么不变性如此重要?更改对象有什么问题?它不是使事情变得简单吗? 举个例子,让我们考虑一个简单的新闻阅读器应用程序,其打开屏幕是新闻标题的列表视图。 如果我设置说最初具有值的对象数组,我将无法对其进行操作。这就是不变性原则的意思,对不对?(如果我错了,请纠正我。)但是,如果我有一个新的News对象必须更新怎么办?在通常情况下,我可以将对象添加到数组中。在这种情况下我该如何实现?删除商店并重新创建?是不是将对象添加到数组中的开销较小?

16
不可变与可变类型
我对什么是不可变类型感到困惑。我知道该float对象被认为是不可变的,在我的书中有这样的例子: class RoundFloat(float): def __new__(cls, val): return float.__new__(cls, round(val, 2)) 由于类的结构/层次结构,这是否被认为是不可变的?意思float是在类的顶部,是它自己的方法调用。类似于此类示例(即使我的书说的dict是可变的): class SortedKeyDict(dict): def __new__(cls, val): return dict.__new__(cls, val.clear()) 可变的东西在类内部具有方法,例如以下类型: class SortedKeyDict_a(dict): def example(self): return self.keys() 另外,对于最后一个class(SortedKeyDict_a),如果我将这种类型的set传递给它: d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2)) 不调用该example方法,它返回一个字典。在SortedKeyDict用__new__其标记为错误。我尝试使用将整数传递给RoundFloat类,__new__并且它未标记任何错误。


24
如何在Python中制作一个不变的对象?
尽管我从不需要它,但让我感到惊讶的是,在Python中创建不可变对象可能有些棘手。您不能仅仅重写__setattr__,因为这样您甚至都无法在中设置属性__init__。将元组子类化是一种有效的技巧: class Immutable(tuple): def __new__(cls, a, b): return tuple.__new__(cls, (a, b)) @property def a(self): return self[0] @property def b(self): return self[1] def __str__(self): return "<Immutable {0}, {1}>".format(self.a, self.b) def __setattr__(self, *ignored): raise NotImplementedError def __delattr__(self, *ignored): raise NotImplementedError 但是然后您可以通过和来访问a和b变量,这很烦人。self[0]self[1] 在纯Python中这可能吗?如果没有,我将如何使用C扩展名呢? (仅在Python 3中有效的答案是可以接受的)。 更新: 因此,将元组子类化是在纯Python 中完成此操作的方法[0],除了通过[1]等访问数据的附加可能性外,该方法行之有效。要解决此问题,所有遗漏的是如何在C中“正确”进行操作,这我怀疑这很简单,只是不执行任何geititemor setattribute等等。但是我没有为此做,而是为此提供了赏金,因为我很懒。:)

10
可变对象与不可变对象
我试图让我了解可变对象和不可变对象。使用可变对象会带来很多负面影响(例如,从方法中返回字符串数组),但是我很难理解它的负面影响。使用可变对象的最佳实践是什么?您是否应尽可能避免使用它们?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.