if-statement - 为什么 Erlang 编译器说我的子句评估为假?
问题描述
当我尝试编译以下代码时:
score(_X) -> mysqrt = math:sqrt(_X),
if
mysqrt < 100.0 -> true;
true -> 0
end.
编译器说:
src/leap.erl:16: 这个子句的守卫评估为“假”
我想我正在分配一个变量mysqrt
,然后检查它的结果,它不一定必须小于100.0.
显然这不是正在发生的事情。我究竟做错了什么?
解决方案
在 Erlang 中,变量名以大写字母或下划线开头。在您的代码中,mysqrt
不是变量,而是原子。
因此,该行mysqrt = math:sqrt(_X)
是一个断言的返回值math:sqrt
等于这个原子,这将失败,因为该函数返回一个浮点数 - 但编译器不知道这一点。
然后你mysqrt
比较100.0
。在 Erlang 中,数字总是比较小于原子,所以mysqrt < 100.0
总是错误的——这是编译器警告你的。
改为调用您的变量MySqrt
,您的代码应该可以工作。
(此外,约定是仅在不使用变量时才使用以下划线开头的变量名,因为这样的名称会抑制编译器的“未使用变量”警告。只调用此函数的参数X
而不是_X
.)
推荐阅读
- reactjs - Firebase 数据未保存到我的反应状态
- python - 使用 psutil 的 Python 程序在运行 8 小时后出现 PermissionError 失败:[WinError 5] 访问被拒绝 - 为什么?
- c# - _mm_set1_epi32 对应的 netCore SSE2 是什么
- android-studio - 您可以将 Python 脚本链接到 Android Studio 吗?
- python - 如何在 pyinstaller 中修复此错误?我正在尝试构建一个 kivy 应用程序
- postgresql - 谷歌云sql在重负载下窒息
- c++ - ESP8266 微控制器上向量迭代器的 C++ 问题
- apache-spark - spark2.4.3 中方法不存在错误导致重新分区失败
- user-interface - Delphi 表单菜单
- npm - 更改 Task Runner Explorer 命令