gpt4 book ai didi

javascript - Eloquent JavaScript : Persistent Group

转载 作者:行者123 更新时间:2023-12-02 23:39:03 25 4
gpt4 key购买 nike

在《Eloquent JavaScript》一书中,它要求创建一个 PGroup 类,该类与之前练习中创建的类类似。它基本上就像一个简化的 Set 类,具有添加、删除和方法。具体我完全不明白的部分在最后。它说:

"The constructor shouldn't be part of the class's interface (though you'll definitely want to use it internally). Instead, there is an empty instance, PGroup.empty, that can be used as a starting value. Why do you need only one Pgroup.empty value, rather than having a function that creates a new, empty map every time?"

这是问题的给出答案:

class PGroup {
constructor(members) {
this.members = members;
}

add(value) {
if (this.has(value)) return this;
return new PGroup(this.members.concat([value]));
}

delete(value) {
if (!this.has(value)) return this;
return new PGroup(this.members.filter(m => m !== value));
}

has(value) {
return this.members.includes(value);
}
}

PGroup.empty = new PGroup([]);

let a = PGroup.empty.add("a");
let ab = a.add("b");
let b = ab.delete("a");

tldr:什么是 PGroup.empty?

编辑:为了消除困惑,我的意思是我不理解 PGroup.empty 的目的,也不理解它与 PGroup 类的关系。例如,它是构造函数的属性吗?

最佳答案

PGroup.empty 表示一个空集。您可以使用 PGroup.empty 作为创建更多集的起点。

PGroup 的这个特定实现的有趣之处在于,adddelete 方法不会修改您正在操作的现有 PGroup 实例。相反,adddelete 返回全新的 PGroup 实例。这意味着每次您在已有的 PGroup 中添加或删除元素时,您都会创建一个全新的 PGroup 实例,而不是修改现有的 PGroup 实例。

使用此模式意味着给定一个空集(在我们的例子中为 PGroup.empty),我们可以创建一大堆其他 PGroup,而无需显式使用 new 关键字。特别是,如果我们想要一组 ['a', 'b', 'c'],我们可以执行以下操作:

let abc = PGroup.empty.add('a').add('b').add('c');

此外,由于当您对其调用 add 方法时,PGroup.empty 实例本身不会改变,因此您可以重用相同的 PGroup.empty 实例任意多次。

let xyz = PGroup.empty.add('x').add('y').add('z');
let efg = PGroup.empty.add('e').add('f').add('g');

这方面的不变性使我们能够满足以下要求:

The constructor shouldn't be part of the class's interface

相反,我们可以使用adddelete来创建更多PGroup实例。

使用添加删除创建 PGroup 的新实例而不是修改 PGroup 的现有实例的技术术语称为 immutibility .

关于javascript - Eloquent JavaScript : Persistent Group,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56160350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com