【发布时间】:2017-10-21 07:18:27
【问题描述】:
我在 Javascript 中创建了一个元组类型,它实现了Iterable 协议。现在应该很容易转换为Map:
const Tuple = (...args) => {
const Tuple = f => f(...args);
Tuple[Symbol.iterator] = () => args[Symbol.iterator]();
return Tuple;
};
new Map([Tuple(1, "a"), Tuple(2, "b")]); // Map {undefined => undefined}
我必须手动进行转换:
const Tuple = (...args) => {
const Tuple = f => f(...args);
Tuple[Symbol.iterator] = () => args[Symbol.iterator]();
return Tuple;
};
const toArray = tx => tx((...args) => args);
const Map_ = (...pairs) => {
return new Map(pairs.map(pair => toArray(pair)));
};
const map = Map_(Tuple(1, "a"), Tuple(2, "b"));
console.log(map.get(1), map.get(2)); // "a" "b"
似乎Map 只接受外部复合类型的Iterable,而不接受内部对。我错过了什么?有没有其他方法可以实现转换?
【问题讨论】:
-
每次创建
Tuple时创建两个函数,您支持什么设计目标? -
不变性;避免使用
Arrays 来存储各种类型的相关数据(例如[a, b])。Array是一个集合,因此应该是[a]类型。 -
不变性不需要您为每个
Tuple创建多个函数。 -
哦,是的,你是对的,它是教堂编码的。当然,不必如此。
-
“它是教堂编码的” 有趣!
标签: javascript dictionary ecmascript-6 tuples iterable