Move的新功能将于2024年推出,这是恰如其名的“Move2024”版本的一部分。其中许多更改都是对源语言的增强,影响编译器,而无需对链上发布的二进制表示进行任何更改。这些变化的主要目标是让Move更易于编写,也更易于阅读。对源语言引入的相对较少的重大变化是为了让Move更
<!--StartFragment-->
Move 的新功能将于 2024 年推出,这是恰如其名的“Move 2024”版本的一部分。其中许多更改都是对源语言的增强,影响编译器,而无需对链上发布的二进制表示进行任何更改。
这些变化的主要目标是让 Move 更易于编写,也更易于阅读。对源语言引入的相对较少的重大变化是为了让 Move 更好地应对未来的发展。
即使添加了这些新功能,现有代码仍可继续编译。由于这些功能是可选的,因此即使依赖项没有,您也可以使用新功能编写软件包。但是,选择利用当前模块中的新功能确实会带来一些重大变化。
本文档重点介绍了一些值得尝试的新功能,并展示了如何迁移现有模块以使用 Move 2024。
信息
请通过GitHub、Discord或Telegram提供任何反馈或报告您遇到的任何问题。
要将项目迁移至 Move 2024 Beta:
删除现有Move.lock
文件(如果存在)以确保您使用的是最新sui-framework
版本。
执行以下操作之一:
Move 2024 包含一个自动迁移脚本,您可以通过sui move migrate
在 Move 项目的根目录中调用来使用它。运行时,控制台会提示您使用哪个 Move 版本。如果您选择2024.beta
,脚本会调用编译器并尝试自动更新代码,以避免更新引入的重大更改public
(包括将结构标记为、使用关键字的可变变量、避免使用受限关键字、将smut
替换为,甚至在许多情况下将路径更新为全局路径)。friend``public(package)
完成此操作后,您的控制台将显示脚本要进行的更改的差异。如果您接受更改,脚本将Move.toml
自动更新您的代码和文件。您现在正在使用 Move 2024 Beta。
使用新的VSCode Move 扩展来获取对 Move 2024 功能的支持。新扩展与原始move-analyzer 扩展相比有许多改进,但如果您想继续使用原始扩展,请务必重建并重新安装move-analyzer
二进制文件以获得 2024 支持:
cargo install --git https://github.com/MystenLabs/sui.git move-analyzer
请参阅Move IDE 和插件的入门指南以了解更多信息。
以下是 Move 2024 中一些新功能的简要概述。
现在,您可以使用语法将某些函数作为方法调用.
。例如,以下调用
vector::push_back(&mut v, coin::value(&c));
现在可以写成
v.push_back(c.value());
其中方法的接收者(在此示例中v
为和c
)在必要时会自动借用(分别为&mut v
和&c
)。
如果它将接收器作为其第一个参数,则可以调用与接收器类型在同一模块中定义的任何函数作为方法。
对于在模块外定义的函数,可以使用public use fun
和声明方法use fun
。
使用方法语法,您可以将某些函数注释为#[syntax(index)]
方法。然后使用 -style 调用来调用这些方法v[i]
。
例如,
*&mut v[i] = v[j];
决定
*vector::borrow_mut(&mut v, i) = *vector::borrow(&v, j);
friend
声明和相关的public(friend)
可见性修饰符已被弃用。取而代之的是public(package)
可见性修饰符,它只允许在定义它们的同一包中调用函数。
现在,您可以使用位置字段定义struct
s,这些字段可通过从零开始的索引进行访问。例如,
public struct Pair(u64, u64) has copy, drop, store;
然后访问每个字段,
public fun sum(p: &Pair): u64 {
p.0 + p.1
}
正如此例所示,您现在可以在结构字段列表后声明能力。
use
和标准库默认值现在您可以嵌套use
别名以获得更简洁的效果。
use sui::{balance, coin::{Self, Coin}};
use
此外,现在每个模块都会自动包含以下声明:
use std::vector;
use std::option::{Self, Option};
use sui::object::{Self, ID, UID};
use sui::transfer;
use sui::tx_context::{Self, TxContext};
相等运算==
和!=
现在如果一方是引用而另一方不是,则自动借用。例如,
fun check(x: u64, r: &u64): bool {
x == r
}
相当于
fun check(x: u64, r: &u64): bool {
&x == r
}
==
这种自动借用可以在和的任一侧发生!=
。
当嵌套循环时,可以方便地跳转到外层循环。例如,
let mut i = 0;
let mut j = 0;
let mut terminate_loop = false;
while (i < 10) {
while (j < 10) {
if (haystack(i, j) == needle) {
terminate_loop = true;
break;
};
j = j + 1;
};
if (terminate_loop) break;
i = i + 1;
}
现在,您可以直接命名外循环(outer
在本例中)并一次性将其全部中断:
let mut i = 0;
let mut j = 0;
'outer: while (i < 10) {
while (j < 10) {
if (haystack(i, j) == needle) break'outer;
j = j + 1;
};
i = i + 1;
}
break
具有价值现在可以使用break
中的值loop
。例如,
let mut i = 0;
let x: u64 = loop {
if (v[i] > 10) break i;
i = i + 1;
};
您也可以使用标签来实现这一点。例如,
let mut i = 0;
let mut j = 0;
let item = 'outer: loop {
while (j < 10) {
let item = haystack(i, j);
if (item == needle) break'outer option::some(item);
j = j + 1;
};
i = i + 1;
if (i == 10) break option::none();
};
不幸的是,重大变更是 Move 2024 中的一项成长烦恼。我们预计这些变更的影响将很小,并提供了迁移脚本来在大多数情况下自动执行这些变更。此外,这些变更为 Move 2024 中即将推出的新功能铺平了道路。
目前,Move 中的所有结构体按照惯例都是公共的:任何其他模块或包都可以导入它们并按类型引用它们。为了更清楚地说明这一点,Move 2024 要求所有结构体都使用关键字声明public
。例如,
// legacy code
struct S { x: u64 }
// Move 2024 code
public struct S { x: u64 }
尽管 Move 团队正在为未来版本开发新的可见性选项,但任何非公共结构此时都会产生错误。
以前,Move 中的所有变量都是隐式可变的。例如,
fun f(s: S, y: u64): u64 {
let a = 0;
let S { x } = s;
a = 1;
x = 10;
y = 5;
x + y
}
现在,您必须明确声明可变变量:
fun f(s: S, mut y: u64): u64 {
let mut a = 0;
let S { mut x } = 5;
a = 1;
x = 10;
y = 5;
x + y
}
如果您尝试在没有此明确声明的情况下可变地重新分配或借用变量,编译器现在会产生错误。
public(friend)
和朋友和public(friend)
可见性是在 Move 开发早期引入的,甚至早于软件包系统。如public(package)部分所示,已在 Move 2024 中public(package)
弃用。public(friend)
下面的声明现在会产生错误:
module pkg::m {
friend pkg::a;
public(friend) fun f() { ... }
}
module pkg::a {
fun calls_f() { ... pkg::m::f() ... }
}
相反,如果你希望你的函数仅在包中可见,请这样写:
module pkg::m {
public(package) fun f() { ... }
}
module pkg::a {
// this now works directly
fun calls_f() { ... pkg::m::f() ... }
}
展望未来,Move 2024 Beta 为该语言添加了以下关键字:enum
、、、和for
。遗憾的是,现在编译器在其他位置发现这些关键字时会产生解析错误。这是语言成熟过程match
中的必要改变。如果您执行自动迁移,迁移工具会将这些关键字重命名为等,重写代码以使用这些转义形式。mut``type``enum
与旧版 Move 相比,Move 2024 修改了路径和命名空间的工作方式,以便将来简化enum
别名。请考虑库中测试注释中的以下代码片段sui_system
:
use sui_system::sui_system;
...
#[expected_failure(abort_code = sui_system::validator_set::EInvalidCap)]
传统 Move 始终将三部分名称视为地址(sui_system
)、模块(validator_set
)和模块成员(EInvalidCap
)。Move 2024 尊重 的范围use
,因此sui_system
在属性中解析为模块,从而总体上产生名称解析错误。
为了避免出现这种预期行为,Move 2024 引入了用于全局限定的前缀操作。要使用,您可以将此注释重写为:
use sui_system::sui_system;
...
#[expected_failure(abort_code = ::sui_system::validator_set::EInvalidCap)]
// ^ note `::` here
如果可能,迁移脚本会尝试使用全局限定来修复命名错误。
除了本文所述的重大变更外,Move 2024 测试版还带来了一些强大的新功能。未来还将推出更多新功能。订阅Sui 开发者简报,了解 Move 今年即将推出的全新、令人兴奋的功能,包括语法宏、带模式匹配的枚举以及其他用户定义的语法扩展。
alpha
和指导beta
beta
(通过 指定edition = "2024.beta"
)是推荐版本。它包括上面提到的所有新功能和所有重大更改。虽然 存在重大更改或错误的风险beta
,但您应该可以放心地在项目中使用它。随着新功能的添加和测试,它们将包含在此beta
版本中。在 添加并完成当年的所有beta
功能后,此版本将结束。**alpha
(通过 指定edition = "2024.alpha"
)将在开发过程中获得新功能和更改。 中的功能alpha
可能会发生重大更改。 因此,alpha
在项目中使用时请谨慎。<!--EndFragment-->
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!