function pipe(...fns) { if (arguments.length === 0) { throw new Error('pipe requires at least one argument'); } return function(...param) { return fns.reduce((pre, fn) => { if (Array.isArray(pre)) { return fn.apply(this,pre); } return fn.apply(this,[pre]); }, param); };}var f = function(a, b, c) { return [a, b, c]; };var g = pipe(f);console.log('g: ', g.length);var f1 = pipe(parseInt, R.multiply, R.map);console.log('g: ', f1.length);
var assert = require('assert');var R = require('../source/index.js');var eq = require('./shared/eq.js');describe('pipe', function() { it('is a variadic function', function() { eq(typeof R.pipe, 'function'); eq(R.pipe.length, 0); }); it('performs left-to-right function composition', function() { // f :: (String, Number?) -> ([Number] -> [Number]) var f = R.pipe(parseInt, R.multiply, R.map); // eq(f.length, 2); eq(f('10')([1, 2, 3]), [10, 20, 30]); eq(f('10', 2)([1, 2, 3]), [2, 4, 6]); }); it('passes context to functions', function() { function x(val) { return this.x * val; } function y(val) { return this.y * val; } function z(val) { return this.z * val; } var context = { a: R.pipe(x, y, z), x: 4, y: 2, z: 1 }; eq(context.a(5), 40); }); it('throws if given no arguments', function() { assert.throws( function() { R.pipe(); }, function(err) { return err.constructor === Error && err.message === 'pipe requires at least one argument'; } ); }); it('can be applied to one argument', function() { var f = function(a, b, c) { return [a, b, c]; }; var g = R.pipe(f); // eq(g.length, 3); eq(g(1, 2, 3), [1, 2, 3]); });});
上述代码是我在进行 ramda 函数库的 pipe 实现过程中的代码。
我无法通过测试用例 performs left-to-right function composition
和 can be applied to one argument
我发现是因为我是实现的代码 f的长度都是0,
所以我想问什么原因造成的这个问题,如何解决?
ramda - test -pipe
在 JavaScript 中,函数的 .length 属性代表函数定义时声明的形参数量(named parameters count),不包括剩余参数。
例如:
function example(a, b, ...rest) {}console.log(example.length); // 输出 2,因为有两个命名参数 a 和 b
而在 remada 中是通过 a,b,c 具名设置的:https://github.com/ramda/ramda/blob/master/source/internal/_arity.js#L1
因为length属性表示该函数预期传入的参数个数,而不是函数定义中声明的参数个数。而在你的代码中,函数 f 接收三个参数,但是它并没有显式地声明这些参数,所以它的 length 属性为 0,这是符合预期的。简单说就是属性没有定义。
var f = R.pipe(R.nAry(3, parseInt), R.multiply, R.map);
在f这里定义一个3就可以解决这个问题了。
请问这样的构造函数如何实现?
突然很好奇,在前端日常开发中,需要经常和 dom 打交道,所以经常要用到 querySelectorAll 和 document.body.getChildren 等方法,但是它们的返回值都是一个类数组类型,我们就需要用一些方法,比如拓展运算符、Array.from 等将它们转换为真数组 来进行操作。 问题: 类数组的意义在哪里?dom 的哪些方法为什么不直接返回一个真数组呢?
问题内容: 这有任何重要目的吗?可以省略吗? 问题答案: 并非总是必要的,但是它确实有其用途。假设我们想在基类上创建一个复制方法。像这样: 现在,当我们创建一个新的并复制它时会发生什么? 该副本不是的实例。这是因为(没有显式检查),我们无法从“基本”类返回副本。我们只能返回。但是,如果我们重置了构造函数: …然后一切都按预期进行:
类有2个构造函数 oracle的第二个构造函数的描述如下 谁能解释一下?
问题内容: 这些来自github上的spring amqp示例,位于https://github.com/SpringSource/spring-amqp- samples.git 这些是 什么类型的Java构造函数?它们是吸气剂和吸气剂的捷径吗? 与此相反 问题答案: 这些构造函数被重载以使用调用另一个构造函数。第一个无参数构造函数使用空参数调用第二个。第二呼叫的第三构造(未示出),其必须采取,