我想它可能是类似的collections.namedtuple,但这更像是一个冻结的词典(一个半冻结的词典).不是吗?
A"frozendict"应该是一个冰冻的字典,它应该有keys,values,get,等,并支持in,for等等.
我正在使用自动实现的属性.我想解决以下问题的最快方法是声明我自己的支持变量?
public Point Origin { get; set; }
Origin.X = 10; // fails with CS1612
Run Code Online (Sandbox Code Playgroud)
错误消息:无法修改'expression'的返回值,因为它不是变量
尝试修改作为中间表达式结果的值类型.由于该值未持久存在,因此该值将保持不变.
要解决此错误,请将表达式的结果存储在中间值中,或使用中间表达式的引用类型.
我最近一直在学习函数式编程(特别是Haskell,但我也经历过关于Lisp和Erlang的教程).虽然我发现这些概念非常具有启发性,但我仍然没有看到"无副作用"概念的实际方面.它有什么实际优势?我试图在功能思维中思考,但是有些情况看起来过于复杂而没有能够以简单的方式保存状态(我不认为Haskell的monad'容易').
是否值得继续深入学习Haskell(或其他纯函数式语言)?功能性或无状态编程实际上是否比程序性更高效?我以后可能继续使用Haskell或其他功能语言,还是应该仅仅为了理解而学习它?
我更关心性能而不是生产力.所以我主要问的是我是否会在函数式语言中比在程序/面向对象/其他方面更高效.
我正在使用Redux.在我的reducer中,我试图从像这样的对象中删除一个属性:
const state = {
a: '1',
b: '2',
c: {
x: '42',
y: '43'
},
}
Run Code Online (Sandbox Code Playgroud)
我希望有这样的东西,而不必改变原始状态:
const newState = {
a: '1',
b: '2',
c: {
x: '42',
},
}
Run Code Online (Sandbox Code Playgroud)
我试过了:
let newState = Object.assign({}, state);
delete newState.c.y
Run Code Online (Sandbox Code Playgroud)
但由于某些原因,它会删除两个州的财产.
可以帮我这么做吗?
我正在创建一个不可变的类.
我已将所有属性标记为只读.
我有一个课程列表.
虽然如果属性是只读的,则可以修改列表.
公开列表的IEnumerable使其不可变.
我想知道为了使一个类不可变而必须遵循的基本规则是什么?
从Java 1.6 Collection Framework文档:
不支持任何修改操作(例如
add,remove和clear)的集合称为不可修改.[...]另外保证Collection对象中的任何更改都不可见的集合称为不可变.
第二个标准让我感到困惑.鉴于第一个集合是不可修改的,并假设原始集合引用已被丢弃,第二行中引用的更改是什么?它是指集合中保存的元素的变化,即元素的状态?
第二个问题:
对于一个不可变的集合,如何提供额外的guarentees指定?如果一个线程更新了集合中元素的状态,那么在不可变集合的线程中,状态中的那些更新是不可见的,这对于不变性是否足够?
对于一个不可变的集合,如何提供额外的guarentees指定?
与同事就此进行了友好的辩论.我们对此有一些想法,但想知道SO人群对此有何看法?
如何在不创建其他变量的情况下处理此错误?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
Run Code Online (Sandbox Code Playgroud)
我不想创建额外的变量来存储x的值.甚至可以做我想做的事情吗?
我正在用Javascript重建一个旧的Java项目,并意识到在JS中没有好的方法来做枚举.
我能想到的最好的是:
const Colors = {
RED: Symbol("red"),
BLUE: Symbol("blue"),
GREEN: Symbol("green")
};
Object.freeze(Colors);
Run Code Online (Sandbox Code Playgroud)
的const保持Colors被重新分配,并冷冻它防止突变的键和值.我正在使用符号,这Colors.RED是不等于0,或除了它自己之外的任何其他东西.
这个配方有问题吗?有没有更好的办法?
(我知道这个问题有点重复,但以前的Q/As都很老了,ES6给了我们一些新功能.)
编辑:
另一个解决序列化问题的解决方案,但我认为仍存在领域问题:
const enumValue = (name) => Object.freeze({toString: () => name});
const Colors = Object.freeze({
RED: enumValue("Colors.RED"),
BLUE: enumValue("Colors.BLUE"),
GREEN: enumValue("Colors.GREEN")
});
Run Code Online (Sandbox Code Playgroud)
通过使用对象引用作为值,可以获得与Symbols相同的冲突避免.
如果字符串是不可变的,那是否意味着....(让我们假设JavaScript)
var str = 'foo';
alert(str.substr(1)); // oo
alert(str); // foo
Run Code Online (Sandbox Code Playgroud)
这是否意味着,当在字符串上调用方法时,它将返回修改后的字符串,但它不会更改初始字符串?
如果字符串是可变的,这是否意味着第二个alert()也会返回oo?
immutability ×10
c# ×3
javascript ×3
variables ×2
.net ×1
collections ×1
dictionary ×1
ecmascript-6 ×1
enums ×1
java ×1
mutability ×1
python ×1
readonly ×1
redux ×1
state ×1
struct ×1
swift ×1
symbols ×1
syntax ×1