带参数的Typescript/Javascript调用方法引用

z31licg0  于 2022-11-26  发布在  TypeScript
关注(0)|答案(3)|浏览(383)

我有一个对二维数组的批量操作。它将对数组中的每个元素调用一个给定的方法“func”:

function forEachMatrixElement(matrix: Complex[][], func: Function): Complex[][] {
  let matrixResult: Complex[][] = new Array(countRows(matrix)).fill(false).map(() => new Array(countCols(matrix)).fill(false)); // Creates a result 2D-Matrix
  for (let row = 0; row < countRows(matrix); row++) {
    for (let col = 0; col < countCols(matrix); col++) {
      matrixResult[row][col] = func.call(matrix[row][col]); // Call the given method
    }
  }
  return matrixResult;
}

我有两个函数要委托给这个方法:下面的代码不需要额外的参数,运行良好:

export function conjugateMatrix(matrix: Complex[][]): Complex[][] {
  return forEachMatrixElement(matrix, Complex.prototype.conjugate);
}

这个方法需要一个额外的参数(一个标量),但我不知道如何将这个参数添加到原型的方法引用中:

export function multiplyMatrixScalar(matrix: Complex[][], scalar: Complex): Complex[][] {
  return forEachMatrixElement(matrix, Complex.prototype.mul); // TODO Call with scalar
}
ttisahbt

ttisahbt1#

进入prototype并使用call()来操作this的值通常是个坏主意。
相反,forEachMatrixElement应该简单地接受一个接受Complex示例的函数,调用者可以决定该函数做什么以及如何应用它的参数。
例如:

function forEachMatrixElement(
  matrix: Complex[][],
  func: (complex: Complex) => Complex // Changed this function type
): Complex[][] {
  let matrixResult: Complex[][] = new Array(countRows(matrix)).fill(false).map(() => new Array(countCols(matrix)).fill(false));
  for (let row = 0; row < countRows(matrix); row++) {
    for (let col = 0; col < countCols(matrix); col++) {
     
      // just invoke the function like any other. No .call()
      matrixResult[row][col] = func(matrix[row][col]); 
      
    }
  }
  return matrixResult;
}

现在,调用它的函数可以简单地为:

export function conjugateMatrix(matrix: Complex[][]): Complex[][] {
  return forEachMatrixElement(matrix, (c) => c.conjugate());
}

export function multiplyMatrixScalar(matrix: Complex[][], scalar: Complex): Complex[][] {
  return forEachMatrixElement(matrix, (c) => c.mul(scalar));
}

参见Playground

dbf7pr2w

dbf7pr2w2#

您可以在multiplyMatrixScalar中创建一个新函数吗?
类似于:

export function multiplyMatrixScalar(matrix: Complex[][], scalar: Complex): Complex[][] {
  const fn = function (this: Complex) { return this.mul(c, scalar)};

  return forEachMatrixElement(matrix, fn);
}
bvk5enib

bvk5enib3#

MDNFunction.call()可以接受其他参数作为参数。因此第一个参数将始终是this绑定,第二个及以后的参数都是参数。
想知道这是否能解决您的问题?因此,您的代码将如下所示

function forEachMatrixElement(matrix: Complex[][], func: Function, scalar?: Complex)

func.call(matrix[row][col], scalar)

相关问题