标签: immutability

为什么Ruby方法中使用感叹号?

在Ruby中,有些方法有一个问号(?),它会询问一个问题include?,询问是否包含有问题的对象,然后返回true/false.

但为什么有些方法会有感叹号(!)而其他方法却没有?

这是什么意思?

ruby methods naming-conventions immutability

520
推荐指数
8
解决办法
13万
查看次数

从Python中的字符串中删除特定字符

我正在尝试使用Python从字符串中删除特定字符.这是我现在正在使用的代码.不幸的是它似乎对字符串没有任何作用.

for char in line:
    if char in " ?.!/;:":
        line.replace(char,'')
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

python string immutability

491
推荐指数
13
解决办法
124万
查看次数

为什么可变结构"邪恶"?

在这里讨论了SO之后,我已经多次读过可变结构是"邪恶"的评论(就像这个问题的答案一样).

C#中可变性和结构的实际问题是什么?

c# struct mutable immutability

470
推荐指数
15
解决办法
7万
查看次数

Java字符串真的是不可变的吗?

我们都知道StringJava 中是不可变的,但请检查以下代码:

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] = '!';  

System.out.println(s1); // Hello Java!  
System.out.println(s2); // Hello Java!  
System.out.println(s3); // World  
Run Code Online (Sandbox Code Playgroud)

为什么这个程序运行这样?为什么价值s1s2变化,但不是s3

java string reflection immutability

391
推荐指数
11
解决办法
5万
查看次数

不可变的意思是什么?

这可能是有史以来最愚蠢的问题,但我认为这对新手来说完全是一个混乱.

  1. 有人可以澄清不可变的含义吗?
  2. 为什么是String不可改变的?
  3. 不可变对象有哪些优点/缺点?
  4. 为什么一个可变对象StringBuilder比首字母和副词更受欢迎?

一个很好的例子(在Java中)将非常感激.

java string immutability

383
推荐指数
11
解决办法
17万
查看次数

在JavaScript中的Const?何时使用它是必要的

我最近在javascript中遇到了const关键字.据我所知,它用于创建不可变变量,我已经测试过以确保它不能重新定义(在node.js中):

const x = 'const';
const x = 'not-const';

// Will give an error: 'constant 'x' has already been defined'
Run Code Online (Sandbox Code Playgroud)

我意识到它还没有在所有浏览器中标准化 - 但我只对node.js/v8的上下文感兴趣,并且我注意到当使用var关键字时,某些开发人员/项目似乎非常喜欢它达到同样的效果.

问题

何时使用const代替var

是否应该在每次声明不会重新分配的变量时使用它?

如果使用var代替const,反之亦然,它实际上是否有任何区别?

javascript const immutability node.js

337
推荐指数
8
解决办法
19万
查看次数

在不可变集合上使用非变异"add"方法的最佳名称是什么?

对于华丽的标题感到抱歉 - 如果我能想出一个简洁的标题,我就不用问这个问题了.

假设我有一个不可变的列表类型.它有一个操作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");
Run Code Online (Sandbox Code Playgroud)

(这是C#代码,如果您觉得语言很重要,我最感兴趣的是C#建议.这不是一个基本的语言问题,但语言的习语可能很重要.)

重要的是现有的列表不会被改变Foo- 所以empty.Count仍然会返回0.

获得最终结果的另一种(更惯用的)方式是:

var list = new ImmutableList<string>().Foo("Hello")
                                      .Foo("immutable")
                                      .Foo("word");
Run Code Online (Sandbox Code Playgroud)

我的问题是:Foo最好的名字什么?

编辑3:正如我稍后透露的那样,该类型的名称可能实际上并不存在ImmutableList<T>,这使得该位置清晰.想象一下,它是TestSuite并且它是不可变的,因为它所属的整个框架是不可变的......

(编辑完3)

到目前为止我提出的选项:

  • Add:常见于.NET,但意味着原始列表的变异
  • Cons:我相信这是函数式语言中的正常名称,但对于没有这些语言经验的人来说毫无意义
  • Plus:我最喜欢的,它并不意味着我的变异.显然,这也用在Haskell中,但期望略有不同(Haskell程序员可能希望它将两个列表一起添加而不是将一个值添加到另一个列表中).
  • With:与其他一些不可变的约定一致,但它与IMO没有完全相同的"附加性".
  • And:不是很具描述性.
  • +的运算符重载:我真的不喜欢这么多; 我通常认为运算符只应用于较低级别的类型.我很乐意被说服!

我用来选择的标准是:

  • 给出方法调用结果的正确印象(即它是带有额外元素的原始列表)
  • 尽可能清楚地表明它不会改变现有列表
  • 在链接在一起时听起来很合理,如上面的第二个例子

如果我不够清楚,请询问更多细节......

编辑1:这里是我的喜欢推理PlusAdd.考虑以下两行代码:

list.Add(foo); …
Run Code Online (Sandbox Code Playgroud)

language-agnostic list naming-conventions immutability

227
推荐指数
27
解决办法
2万
查看次数

Java中字符串的不变性

请考虑以下示例.

String str = new String();

str  = "Hello";
System.out.println(str);  //Prints Hello

str = "Help!";
System.out.println(str);  //Prints Help!
Run Code Online (Sandbox Code Playgroud)

现在,在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! 
Run Code Online (Sandbox Code Playgroud)

这是否意味着再次创建了两个对象("Mississippi"和"M!ss!ss!pp!"),并且引用str指向replace()方法之后的另一个对象?

java string immutability

211
推荐指数
7
解决办法
9万
查看次数

字符串是不可变的.究竟是什么意思?

我在不可变字符串上编写了以下代码.

public class ImmutableStrings {

    public static void main(String[] args) {
        testmethod();
    }

    private static void testmethod() {
        String a = "a";
        System.out.println("a 1-->" + a);
        a = "ty";
        System.out.println("a 2-->" + a);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

a 1-->a  
a 2-->ty
Run Code Online (Sandbox Code Playgroud)

这里变量的值a已经改变(许多人说不可变对象的内容不能改变).但究竟是什么意思说String是不可改变的?你能否为我澄清一下这个话题?

来源:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

java string immutability

194
推荐指数
4
解决办法
26万
查看次数

浅拷贝,深度拷贝和正常分配操作之间究竟有什么区别?

import copy

a = "deepak"
b = 1, 2, 3, 4
c = [1, 2, 3, 4]
d = {1: 10, 2: 20, 3: 30}

a1 = copy.copy(a)
b1 = copy.copy(b)
c1 = copy.copy(c)
d1 = copy.copy(d)


print("immutable - id(a)==id(a1)", id(a) == id(a1))
print("immutable - id(b)==id(b1)", id(b) == id(b1))
print("mutable - id(c)==id(c1)", id(c) == id(c1))
print("mutable - id(d)==id(d1)", id(d) == id(d1))
Run Code Online (Sandbox Code Playgroud)

我得到以下结果 -

immutable - id(a)==id(a1) True
immutable - id(b)==id(b1) True
mutable - id(c)==id(c1) False
mutable - id(d)==id(d1) False
Run Code Online (Sandbox Code Playgroud)

如果我进行深度扫描 …

python copy immutability deep-copy variable-assignment

192
推荐指数
6
解决办法
9万
查看次数