gpt4 book ai didi

javascript - CoffeeScript 对 splat 和这个实现的好奇心

转载 作者:行者123 更新时间:2023-11-30 10:10:56 26 4
gpt4 key购买 nike

所以,通过一些函数式和柯里化(Currying)作为它的驱动程序的代码。我看到了这种 splat 用法的约定,虽然我可以“看到”它在编译的 javascript 中做了什么,但我还没有看到任何提到这一点是文档等。在行尾的 coffeescript 的“...”splat 用法上(见下文)。

例如,我们有:

flip = (f) -> (as...) -> f as.reverse()...

编译为:

flip = function(f) {
return function() {
var as;
as = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
return f.apply(null, as.reverse());
};
};

现在,我明白“as...”被用作:

as = 1 <= arguments.length ? __slice.call(arguments, 0) : [];

获取参数并将它们分配给“as”。

但是,我没有考虑的是这里的用法:

 -> f as.reverse()...  # <-- the "..." at the end. 

如果我删除它('...'),那么编译后的“应用”就会消失。所以,这里最后使用“...”的约定是什么。我在我的 coffeescript 知识中缺少这个概念。

最佳答案

... 位于行尾没有什么特别之处。

您在这里看到的是 splat 参数和 splat 参数之间的区别。 ... 运算符用于这两种情况,因为它们是相关的。不过,这可能会造成混淆,因为这些用途彼此相反。

as.reverse()... 是传递给 f 的 splat 参数。编译后的 JavaScript 使用 f.applyas.reverse() 分解为接收器 f 的多个参数。

as... 是一个 splat 参数。编译后的 JavaScript 使用 __slicearguments 对象转换为接收器内的数组,以将参数收集到一个列表中。

关于javascript - CoffeeScript 对 splat 和这个实现的好奇心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26744457/

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