了解编译错误

了解编译错误

> LeekScript 教程

你正心满意足地敲着自己的 AI。代码一行行滚过,一个个逻辑清晰的变量名和函数名(比如 sfatyu_2)接连登场,生活多么美好…… 突然!你按下了“保存”键,编译器开始检查你的代码。它死死地盯着你,目光灼灼…… 然后,悲剧发生了!编辑器底部冒出一条(甚至好几条!)刺眼的红线。这些古怪又玄奥的咒语到底是什么意思?

这篇指南将为你揭开真相,让你也成为懂行的人。

未知变量或函数

是谁忘了声明自己的变量?回头看看 变量 和 函数详解 这两篇教程,也许会有帮助。

!未知变量或函数

这里的变量 enemy 没有声明,必须先用关键字 var 创建它。 修正:var enemy = getNearestEnemy();

那这一个呢? !未知函数示例

嗯,作者不过是一只抱着键盘的猴子,没发现自己用的是 getNeerest(根本不存在),而不是就在上方声明的 getNearest。

变量名不可用

不能用一个已经声明过的变量名再声明一次变量。

![](/user-image/b5/2d/b52db71d200ccd28889d996f04f08795d78ae6bb1bc3f8672d3b64f301e3aed7.webp)

修正(很丑):var moi2 = 1 更好的修正是给变量起一个真正符合其用途的名字。

注意:全局变量的名字也可能引发这个错误。

如果你把神圣的分号写成了逗号,同样会撞上这个错误: ![](/user-image/51/3a/513a2ab72e76dbbcd758ecdbb98bcfb599f4cf5269f0eaa7edf155be275e261a.webp)

修正:var enemy = getNearestEnemy();

这是因为变量可以在一行内连续声明: var variable1 = 1, variable2 = 2; 是完全合法的写法(见 变量)。

函数名不可用

和上一个错误一样,不能重复使用已经用过的函数名。

![](/user-image/df/9a/df9a501a8f76eca98f3d8db9584d5e12887c729ce90f215114b0d2f94863fc5c.webp)

修正(非常丑):function getNearest2() {

无法使用此参数名

想拿全局变量的名字当参数名,是吧?要是碰上我哪个没那么好说话的同事,你知道会有什么下场吗?

![](/user-image/4b/32/4b3220098aab1b31872b53cdb4b8b1bafbf635066022b43a529539cd107ed878.webp)

修正:

应为右括号

正如错误信息所说,所示的那一行少了一个括号。 !错误的 if

这里第 19 行代码应该是 if (not isAlive(enemy)) {

应为一个值

函数调用没有闭合??这就是你的下场! !应为一个值

修正:moveToward(enemy);

参数数量不正确

参数?那是啥?看来得回头复习一下 函数详解 教程了!

!参数数量不正确

这里的函数 moveToward 接受 1 到 2 个参数,而我们一个都没给。编译器当然要敲我们的手指了。 修正:moveToward(enemy); 或 moveToward(enemy, mp);,其中 mp 是一个数字。

注意,如果给函数传了太多参数,也会得到同样的错误(例如:moveToward(enemy, mp, truc);)。

有代码块未闭合

代码块是什么? 就是被 { } 包起来的一段代码。这里用 { 打开了一个代码块,却没有把它闭合。 !代码块未闭合

这里在 if 结束后少了 }。于是编译器指出了当前代码块的结尾(这里是文件末尾),告诉我们忘了闭合所有代码块。 修正:

没有需要闭合的代码块

这种情况和上一个正好相反:我们用 } 闭合了一个代码块,却没有先打开它…… !没有需要闭合的代码块

修正:if (not isAlive(enemy)) {

应为左括号

再去翻翻 函数详解 教程吧:即使不需要给函数传参数,也至少要写上括号 ()。

![](/user-image/6c/cb/6ccbade5a10251a86c3291390cee6a3ed5e532dd7c8c3ec23e2b0649d0299d97.webp)

修正:function getNearest() {

应为参数名称

和上面一样,声明函数时,别忘了在 { 之前闭合括号。

!应为参数名称

修正:getNearest() {

do 块之后应为 while

去 循环 教程转一圈?do-while 要求在代码块结尾写上 while。

![](/user-image/cd/bb/cdbbd97bb14005f258c0a857d22e37a887e27194c9e626e9c4653c7354bd80fb.webp)

修正:} while(true);

什么?没人用 do while?

应为变量名……

应为有效的变量名

![](/user-image/ba/6e/ba6ea13d7a3a7fb77c85495e61848329a25e822f8e9049c03ebdd75f3afb9a6e.webp)

global 关键字之后应为变量名

![](/user-image/0e/83/0e83945f91922eb9a9d3e792e87afa4fababc8e99b5c4feea0b89d65359c0cad.webp)

这两种情况都是忘了给变量起名字。去 变量 教程转一圈也没什么坏处。

修正: var maVariable = 1; global maVariable = "Variable";

此 else 没有对应的 if

else(或 else if)前面必须始终有一个 if(见 条件)。我们这儿可是文明人!没有“如果”,哪来的“否则”?不然可是要被敲手指的。

![](/user-image/56/9e/569e6713bc07c4002c0e43552f35687bb481c93f9ed0372a55db5c79effd4367.webp)

修正:

表达式不完整

当你没有遵守某种表达式的语法时,就会得到这个错误。这里是一个三元表达式。如果你还不了解三元表达式:它是把 if {} else {} 写在一行里的写法(见 条件 和 操作数)。

![](/user-image/cb/cb/cbcb50f396353ac7e8686f74ce9df3c62ba8bf4e3b680f60c48858f43a5459cf.webp)

修正:(getAliveEnemies() > 0) ? getNearestEnemy() : getEnemies()[0];

什么?这段代码毫无用处?你竟敢这么说!我有挑剔过你的代码吗?

无效字符

跟你说了,是分号!不完全是句号,也不完全是逗号,而是两者各占一点。 无效字符这个错误会毫不留情地砸到你头上。

![](/user-image/e1/23/e123a4ae2d1dbfc6dd0f383ad4c5f7ce7adefc1027223a2f0b3ab9b2f79fece8.webp)

修正:var enemy = getNearestEnemy();

此处不应出现该运算符

![](/user-image/5d/7e/5d7e3e9168722f6db02400785ba857ee0262ef3e5a087fcddece76e5fae5cdfd.webp)

不应出现?那还用说!你到底是怎么写成这样的?? 不能把运算符(运算符)当变量来用。

只能在主代码块中声明函数

LeekScript 只允许在主代码块中声明函数,不能在其他代码块里声明函数。

![](/user-image/21/14/211442d31e4fdc7d115b4af63ed2a8f529d510d69a666798898bbc8cbeb84a83.webp)

![](/user-image/27/48/274891affcb46b971c2d90a28010685d6ef2f8e4ef2c536ce1a071fdeb54911a.webp)

修正:

有一种特殊情况可以在函数里声明另一个函数,去看看 函数详解 教程吧。

全局变量只能在主代码块中声明

和上一个一样,只不过换成了全局变量!全局变量只能在主代码块中声明,不能在其他代码块里声明。不能在 if 里,不能在循环里,不能在函数里。就这样,句号……哦不,分号。

![](/user-image/62/6c/626c11cb6b49c7cd0e6df4b7e5efa5b8d00889ac4a3f7287d5e9ba7a05c51a1c.webp)

修正:

只能在主代码块中使用 include 引入 AI

会用 include 很好,用对了更好!这里我们试图在主代码块以外的地方引入 AI,编译器正用一双吓人的眼睛盯着我们……

![](/user-image/2c/a4/2ca47ac049c515abaa983f719abb332bdb4b9a359a3d6632646931061aea415d.webp)

修正:

注意:使用 Pilow 的 AI 却没能赢下战斗,作者概不负责。

关键字 break 只能在循环内使用

这个错误的描述已经把自己解释得很清楚了:break 只能在循环里使用(见 循环)

![](/user-image/97/b2/97b2e1f4bb486fe91014ed58dbcb6f63a8237818b1063c0ac736e81d5af79769.webp)

修正:

注意: 这段代码的效果和用 if 完全一样,因为循环在第一轮就被打断了。不过这样写还是很可笑,不是吗?

关键字 continue 只能在循环内使用

和上面那个错误一模一样,只不过你用的是 continue 而不是 break。

注意: 用下面这段代码,可以让几位 Pilow 流泪,顺便给服务器机房加加温:

当前代码块中已有 break、return 或 continue,其后无法再添加语句

在“又长又能自我解释的编译错误”这个非常小众的比赛里,冠军就是它了。 如果你遇到这个错误,说明你的代码里有一条语句放在了永远不会被执行的位置。 比如在下面的例子里,我们把 debug 放在了 break 语句之后,而 break 会直接跳出循环!

![](/user-image/a7/dd/a7dd253ddfbe6771d56da9126b298e803863d087e9102988634883a31f467132.webp)

修正:

正如它的描述所说,return 或 continue 也可能引发这个错误。

![](/user-image/14/f0/14f0ec32dd6338e36621329dfdf4db173319c7bc8ef63763bf46c14e177fbce1.webp)