一条 var 声明同时承担三项职责:声明一个与特定类型绑定的逻辑存储位置;把名称绑定到该存储位置;用新建的值初始化这块存储空间,使变量成为该值的所有者。
显式声明与是否写出类型标注是两个独立维度。var a = 5 由编译器推断类型为 Int,var b: Float64 = 3.14 则显式指定类型,也可以写成 var c: String 只创建名称而暂不初始化。
无论哪种写法,Mojo 变量都使用词法作用域,即变量的定义由它在源码中的位置决定,而非运行时的执行时机。作用域级别取决于声明方式,变量具有块级作用域:嵌套代码可以读取和修改外层作用域的变量,外层作用域无法读取内层作用域的变量。内层块中用同名 var 声明的变量会创建全新变量并遮蔽外层同名变量。
从 1.0 版本开始,所有变量声明都应使用 var。不使用 var 的隐式声明已被弃用,编译时会给出警告并提供自动修复提示以插入 var。除直接赋值外,首次赋值、walrus 操作符目标以及裸类型注解形式同样会触发警告。
已经明示绑定方式的写法无需修改,包括 for 循环目标、with ... as、except ... as、推导式目标以及下划线丢弃符。