变量不是实例变量

问题描述

我做了这个阶乘解算器,但输出的是:

  We've found a bug for you!
  6| let factorialNumber = 0;
  7| Js.log(factorial(factorialNumber));
(error here)8|  factorialNumber = factorialNumber + 1;
  9|}
The value factorialNumber is not an instance variable

代码

let rec factorial = (n) =>
  n <= 0
  ? 1
  : n * factorial(n - 1);
while (true){
  factorialNumber = 0
  Js.log(factorial(factorialNumber));
  factorialNumber = factorialNumber + 1
}

解决方法

有道理,variables are immutable by default。您也不会在任何地方将factorialNumber声明为变量。

进行此编译所需的更改是:

  1. 使用let
  2. 声明变量
  3. 使用ref将变量设为mutable reference
  4. 使用^
  5. 访问引用的值
  6. 使用:=
  7. 为引用分配新值
while (true) {
  let factorialNumber = ref(0);
  Js.log(factorial(factorialNumber^));
  factorialNumber := factorialNumber^ + 1
}

但是,这仍然没有多大意义,因为您仍在每次迭代中运行factorial(0)。我怀疑您要在循环外移动声明和初始赋值,以便在每次迭代时将其递增一:

let factorialNumber = ref(0);

while (true) {
  Js.log(factorial(factorialNumber^));
  factorialNumber := factorialNumber^ + 1
}