我试图理解扩展如何在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而不是扩展列表?
持久性和不可变数据结构有什么区别吗?维基百科在讨论持久性时指的是不可变数据结构,但我觉得两者之间可能存在细微差别.
来自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 =功能?
遍布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) 我是Objective C的新手,我想知道在Objective-C中定义不可变类的最佳方法是什么(比如NSString).
我想知道为了使类不可变,必须遵循的基本规则是什么.
我觉得 :
我忘记了什么吗?
谢谢
c ++中是否存在类似于clojure中的持久性数据结构实现?
我正在使用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) 通过反射,在枚举类型的字段中查看,我惊讶地发现,保留枚举的特定实例的实际值的"支持"实例字段不是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) 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不.我试图将不可变位图转换为可变位图.它适用于资源图像,但不适用于文件图像.有什么问题?
在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个多小时,仍然无法绕过它.非常感谢一些帮助.
immutability ×10
c# ×2
c++ ×2
.net ×1
android ×1
arrays ×1
bitmap ×1
clojure ×1
ecmascript-6 ×1
enums ×1
interface ×1
jackson ×1
java ×1
javascript ×1
json ×1
list ×1
mutable ×1
objective-c ×1
persistence ×1
powershell ×1
python ×1
reactjs ×1
struct ×1