> LeekScript 教程
你决定切换到严格模式,结果编辑器里一下子冒出一大堆以前从没见过的警告。别慌,严格模式的意义就在于更不宽容,尤其是在类型上给你留的自由更少。 下面来看几种常见的警告,先弄明白它到底指出了什么问题,再找办法解决。
先来个简单的例子:我想把一个计算结果存进整数类型的变量里。
这里的问题在于,sqrt 函数总是返回实数类型的值,即使从数学上说 sqrt(4) 等于 2。而实数放进整数类型的变量里不可能毫无损失:比如 sqrt(2) 的小数部分该怎么办?所以编译器要求你明确做出选择。 有几种办法可以消除这个警告:
另一种情况:我有一个如下定义的整数映射(Map),想把其中的一个值存进同样是整数类型的变量里,按理说类型应该对得上……
为什么警告说 mapEntier[0] 的类型是“integer?”,而不是简单的“integer”? 复习一下:类型末尾的“?”表示这个类型也接受 null 值,相当于“integer | null”。那么,既然按类型我的映射里只有 integer,为什么它可能返回 null 呢?要读取映射中的值,得传入一个键,这里就是方括号里的“0”。这个键必须是映射定义的键类型,这里是 integer,所以这一步没有问题。但编辑器无法保证映射里一定存在这个键,而用不存在的键读取映射,返回的总是 null。因此,按键访问映射得到的结果永远是可为 null 的。 现在来看看怎么解决这个问题,不再收到警告:
这一次,我有一个想要排序的整数数组,乍看没什么复杂的,我甚至直接照搬了文档里的例子
可就这么简单的一行,我却收到了 2 条警告。先看第一条:它被括号包着,意思是问题出在函数的参数上,参数不符合预期的签名。 查一下 arraySort 的文档,看看它的签名:Function real | integer> => Array>。也就是说,这个函数需要 2 个参数:第一个参数是数组,第二个参数是一个函数,这个函数同样接受 2 个参数,并返回一个整数或实数。第一个参数我们传的确实是数组,这里没问题,所以出问题的是第二个参数:我们传入的函数签名是 Function any>,而 arraySort 期望的是 Function real | integer>,返回类型不符合预期。
回调函数的类型问题解决了,还剩第二条警告。正如刚才看到的,arraySort 函数的返回值并不是我们的变量所期望的 Array\,而只是 Array,所以需要显式地对返回值进行类型转换(cast)来解决这个问题。
Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.