Luau回顾:2022年6月

Luau 是我们开发的新语言,您可以在https://luau-lang.org上了解更多内容。

下边界计算

编辑: 我近期发现这个功能还未完全上线。预计在本周晚些时间上线

编辑2: 测试版功能现已上线!未能按时上线,我们深表歉意!

编辑3: 我们需要暂时下线测试版功能,否则会导致程序崩溃。敬请期待!

Luau语言有一个常见问题,其工作方式主要是通过检查程序中的表达式,缩小可能阻止特定变量值的上边界。换句话说,每看到一个变量被使用时,就会从该变量的域中消除可能的值的集合。

在一些重要情况下,这样做并不会产生有利的结果。以此函数为例:

function find_first_if (vec, f)
    for i, e in ipairs(vec)  do
        if f(e) then
           return i
        end
     end

    return nil
end

Luau语言从上到下扫描函数,首先看到行return i ,由此推断find_first_if必须返回至 i 类,即数字。

本来是没什么事的,但当return nil这一行出现时就出问题了,由于我们是在不断地收窄类型,因此从这行代码可以推出所得的函数的返回类型为nil。既然已经得出结论,函数一定返回至数字,Luau就会报告一个错误。

在这种情况下,我们实际上想做的是用这些返回语句推断函数返回类型的下边界。与其说“这个函数必须返回nil类型的值”,我们应该说“这个函数也可以返回至nil类型的值。”

下边界计算正好可以做到这一点。在未来Luau将为上述功能推断number?类型。

而这的确会带来一个不良后果:如果函数没有返回类型的注释,我们将不再在返回语句上报告类型错误。我们认为这是正常的平衡,但还会继续关注进一步确认。

下边界计算比我们一直开发的其他计算更大,风险也更大,因此我们在罗布乐思哦工作是中建立了一个名为试验Luau语言功能的测试功能来启用它们。

欢迎各位开发者去尝试这个新功能,并告知我们大家的想法!

已知漏洞

当启用下边界计算时,我们已知存在某些循环类型的漏洞。例如,以下是已知有问题的语句。

type T = {T?}? -- spuriously reduces to {nil}?

我们希望尽快解决这个问题。

现在,所有表字面量将生成无密封表

以前,创建密封表的唯一方法是使用字面上的空表。我们稍微放松了限制:由{}表达式创建的所有表在其创建的范围内都视为无密封表:

local T = {}
T.x = 5 -- OK

local V = {x=5}
V.y = 2 -- previously disallowed.  Now OK.

function mkTable()
return {x = 5}
end

local U = mkTable()
U.y = 2 -- Still disallowed: U is sealed

其他修复

  • 创建类型的多行字符串表示时,调整缩进和空白,让类型更易于读取。

  • 一些小错误修复可自动完成

  • 修复后访问表中不存在的属性会报告错误。

  • 提升了function foo() → ReturnType错误代码的语法分析器性能(正确的代码为function foo(): ReturnType

  • 改进了因错误使用function关键字来启动类型如 type T = function代码的解析错误

  • 修复的一些小的崩溃,提升了性能

感谢!

特别感谢所有的开源贡献者:

Allan N Jeremy

Daniel Nachun

JohnnyMorganz

Petri Häkkinen

Qualadore

关于我们    加入我们    条款    隐私政策
©2021 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。
粤ICP备20013629号