为什么Erlang编译器说我的子句的计算结果为false?

nim*_*nja 2 erlang if-statement

当我尝试编译以下代码时:

score(_X) -> mysqrt = math:sqrt(_X),
  if
    mysqrt < 100.0 -> true;
    true -> 0
  end.
Run Code Online (Sandbox Code Playgroud)

编译器说:

src/leap.erl:16:此子句的守卫评估为'false'

我想我正在分配一个变量mysqrt,然后检查它的结果,这不一定要小于100.0. 显然那不是正在发生的事情.我究竟做错了什么?

leg*_*cia 10

在Erlang中,变量名以大写字母或下划线开头.在你的代码,mysqrt不是一个变量,而是一个原子.

mysqrt = math:sqrt(_X)因此该行是一个断言,返回值math:sqrt等于这个原子,这将失败,因为该函数返回一个浮点数 - 但编译器不知道这一点.

那么你应该比较mysqrt100.0.在Erlang中,数字总是比较小于原子,所以mysqrt < 100.0总是假的 - 这是编译器警告你的.

MySqrt相反,调用您的变量,您的代码应该工作.

(此外,惯例是仅在不使用变量时使用以下划线开头的变量名称,因为这样的名称会抑制编译器的"未使用的变量"警告.仅仅调用此函数的参数X而不是_X.)