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

If statement 为什么Erlang编译器说my子句的计算结果为false?,if-statement,erlang,If Statement,Erlang,当我尝试编译以下代码时: score(_X) -> mysqrt = math:sqrt(_X), if mysqrt < 100.0 -> true; true -> 0 end. score(X)->mysqrt=math:sqrt(X), 如果 mysqrttrue; 正确->0 结束。 编者说: src/leap.erl:16:此子句的保护计算结果为“false” 我想我是在分配一个变量mysqrt,然后检查它的结果,它不一定要小于10

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

score(_X) -> mysqrt = math:sqrt(_X),
  if
    mysqrt < 100.0 -> true;
    true -> 0
  end.
score(X)->mysqrt=math:sqrt(X),
如果
mysqrt<100.0->true;
正确->0
结束。
编者说:

src/leap.erl:16:此子句的保护计算结果为“false”


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

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

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

然后将
mysqrt
100.0
进行比较。在Erlang中,数字的比较总是小于原子,因此
mysqrt<100.0
总是错误的-这就是编译器警告您的

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

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