首页 > 解决方案 > 为什么 Erlang 编译器说我的子句评估为假?

问题描述

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

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

编译器说:

src/leap.erl:16: 这个子句的守卫评估为“假”

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

标签: if-statementerlang

解决方案


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

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

然后你mysqrt比较100.0。在 Erlang 中,数字总是比较小于原子,所以mysqrt < 100.0总是错误的——这是编译器警告你的。

改为调用您的变量MySqrt,您的代码应该可以工作。

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


推荐阅读