标签: immutability

使用Python中的列表扩展的意外行为

我试图理解扩展如何在Python中工作,它并没有完全按照我的期望.例如:

>>> a = [1, 2, 3]
>>> b = [4, 5, 6].extend(a)
>>> b
>>> 
Run Code Online (Sandbox Code Playgroud)

但我原以为:

[4, 5, 6, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

为什么返回None而不是扩展列表?

python arrays list immutability

18
推荐指数
3
解决办法
8616
查看次数

持久性与不可变数据结构

持久性和不可变数据结构有什么区别吗?维基百科在讨论持久性时指的是不可变数据结构,但我觉得两者之间可能存在细微差别.

immutability object-persistence data-structures

18
推荐指数
2
解决办法
9104
查看次数

如何在C++中创建不可变的结构?

来自C#背景,我习惯于使结构不可变的做法.
因此,当我开始使用C++进行编程时,我尝试对通常按值传递的类型执行相同的操作.

我有一个简单的结构,它代表一个自定义索引,只是包装一个整数.因为在C++中const关键字有点类似于readonlyC#,所以实现我的结构似乎是合理的:

struct MyIndex
{
    MyIndex(int value) :
        Value(value)
    {
    }

    const int Value;
};
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是这个结构的行为与C#中的不可变结构完全不同.不仅MyIndex不能修改变量的Value字段,而且任何现有MyIndex变量(局部变量或字段变量)都不能用另一个MyIndex-instance 替换.

所以下面的代码示例不能编译:

a)使用index作为循环变量.

MyIndex index(0);

while(someCondition)
{
    DoWork();

    index = MyIndex(index.Value + 1); // This does not compile!
}
Run Code Online (Sandbox Code Playgroud)

b)修改类型的成员字段 MyIndex

class MyClass
{
    MyIndex Index;

    void SetMyIndex(MyIndex index)
    {
        Index = index; // This does not compile!
    }
};
Run Code Online (Sandbox Code Playgroud)

这两个示例没有编译,构建错误是一样的:

错误C2582:'operator ='函数在'MyIndex'中不可用

这是什么原因?为什么不能将变量替换为另一个实例,尽管它们不是const?构建错误意味着什么是exaclty?那是什么operator =功能?

c++ immutability

18
推荐指数
1
解决办法
8383
查看次数

如何使结构不可变?

遍布Stack Overflow和互联网我发现保持结构不可变是一个很好的设计原则.不幸的是,我从来没有看到任何实际上导致这些结构真正不可变的实现.

假设一个struct里面没有任何引用类型,我如何实际构造一个struct不可变?也就是说,如何防止任何原始字段的变异(可能是编译时/运行时异常)?

我写了一个简单的测试,尝试使一个结构不可变,但甚至没有使用System.ComponentModel.ImmutableObjectAttribute工作:

class Program
{
    static void Main(string[] args)
    {
        ImmutableStruct immStruct1 = new ImmutableStruct();
        Console.WriteLine(immStruct1); //Before mutation.

        immStruct1.field1 = 1;
        immStruct1.field2 = "Hello";
        immStruct1.field3 = new object();
        Console.WriteLine(immStruct1); //After 1st mutation.

        immStruct1.field1 = 2;
        immStruct1.field2 = "World";
        immStruct1.field3 = new object();
        Console.WriteLine(immStruct1); //After 2nd mutation.

        Console.ReadKey();
    }
}

[ImmutableObject(true)]
struct ImmutableStruct
{
    public int field1;
    public string field2;
    public object field3;

    public override string ToString()
    {
        string field3String = "null";
        if (field3 != null)
        { …
Run Code Online (Sandbox Code Playgroud)

c# struct immutability

18
推荐指数
1
解决办法
9681
查看次数

在Objective C中定义不可变类的最佳方法

我是Objective C的新手,我想知道在Objective-C中定义不可变类的最佳方法是什么(比如NSString).

我想知道为了使类不可变,必须遵循的基本规则是什么.

我觉得 :

  • 不应该提供塞特犬
  • 如果使用属性,它们应该是只读的
  • 要"禁用"键值编码,accessInstanceVariablesDirectly必须覆盖并返回NO

我忘记了什么吗?

谢谢

objective-c immutability

17
推荐指数
2
解决办法
3252
查看次数

c ++中的持久数据结构

c ++中是否存在类似于clojure中的持久性数据结构实现?

c++ persistence clojure immutability

17
推荐指数
2
解决办法
3498
查看次数

杰克逊JSON,不可变类和接口

我正在使用Jackson示例,并且在使用不可变类和接口进行反序列化时遇到一些麻烦.

以下是我的代码:

package com.art.starter.jackson_starter;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
/**  * Hello world!  *  */ public class App  {
    public static void main( String[] args ) throws JsonGenerationException, JsonMappingException, IOException
    {
        System.out.println( "Hello World!" );

        AddressImpl.AddressBuilder builder = new AddressImpl.AddressBuilder();
        NameImpl.Builder nameBuilder = new NameImpl.Builder();
        UserImpl.Builder userBuilder = new UserImpl.Builder();


        Name name = nameBuilder.first("FirstName")
                  .last("LastName")
                  .build();

        Address address =  builder.setCity("TestCity")
               .setCountry("TestCountry")
               .setState("PA")
               .setStreet("TestAddress")
               .setZip(123)
               .build();      

        User user = userBuilder.address(address)
                 .gender(User.Gender.MALE)
                 .isVerified(true)
                 .userImage(new byte[5]) …
Run Code Online (Sandbox Code Playgroud)

java json interface immutability jackson

17
推荐指数
1
解决办法
3万
查看次数

.NET枚举类型实际上是可变的值类型吗?

通过反射,在枚举类型的字段中查看,我惊讶地发现,保留枚举的特定实例的实际值的"支持"实例字段不是private,正如我所想的那样,但是public.它也不readonly是.(IsPublic是的,IsInitOnly假的.)

许多人认为.NET类型系统中的"可变"值类型"邪恶",那么为什么枚举类型(例如从C#代码创建)就是这样?

现在,事实证明,C#编译器有某种魔法否认公共实例字段的存在(但见下文),但在例如PowerShell中你可以这样做:

prompt> $d = [DayOfWeek]::Thursday
prompt> $d
Thursday
prompt> $d.value__ = 6
prompt> $d
Saturday
Run Code Online (Sandbox Code Playgroud)

该字段value__可以写入.

现在,要在C#中执行此操作,我必须使用,dynamic因为看起来使用正常的编译时成员绑定,C#假装public实例字段不存在.当然要使用dynamic,我们将不得不使用枚举值的装箱.

这是一个C#代码示例:

// create a single box for all of this example
Enum box = DayOfWeek.Thursday;

// add box to a hash set
var hs = new HashSet<Enum> { box, };

// make a dynamic reference to the same …
Run Code Online (Sandbox Code Playgroud)

.net c# powershell enums immutability

17
推荐指数
1
解决办法
1673
查看次数

将不可变的位图文件转换为可变的位图

A:

 Bitmap immutableBmp= BitmapFactory.decodeResource(getApplicationContext().getResources(),R.drawable.sample);
 mutableBitmap=immutableBmp.copy(Bitmap.Config.ARGB_8888, true);
Run Code Online (Sandbox Code Playgroud)

B:

Bitmap immutableBmp= BitmapFactory.decodeFile(filePath);
mutableBitmap=immutableBmp.copy(Bitmap.Config.ARGB_8888, true);
Run Code Online (Sandbox Code Playgroud)

C:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable=true;
myBitmap=BitmapFactory.decodeFile(filePath,options);
Run Code Online (Sandbox Code Playgroud)

A作品,但B和C不.我试图将不可变位图转换为可变位图.它适用于资源图像,但不适用于文件图像.有什么问题?

android bitmap mutable immutability

17
推荐指数
2
解决办法
1万
查看次数

以不可变的方式更新数组中的一个对象

在React的this.state中,我有一个名为formErrors包含以下动态对象数组的属性.

[
  {fieldName: 'title', valid: false}, 
  {fieldName: 'description', valid: true},
  {fieldName: 'cityId', valid: false},
  {fieldName: 'hostDescription', valid: false},
]
Run Code Online (Sandbox Code Playgroud)

假设我需要将具有fieldName的状态对象更新cityId为有效值true.

解决这个问题的最简单或最常用的方法是什么?

我可以使用任何库immutability-helper,immutable-js等或ES6.我试过用Google搜索了4个多小时,仍然无法绕过它.非常感谢一些帮助.

javascript immutability ecmascript-6 reactjs

17
推荐指数
2
解决办法
1万
查看次数