Move语言(2024版)

  • Alan
  • 更新于 2024-10-11 10:24
  • 阅读 173

Move的新功能将于2024年推出,这是恰如其名的“Move2024”版本的一部分。其中许多更改都是​​对源语言的增强,影响编译器,而无需对链上发布的二进制表示进行任何更改。这些变化的主要目标是让Move更易于编写,也更易于阅读。对源语言引入的相对较少的重大变化是为了让Move更

<!--StartFragment-->

Move 的新功能将于 2024 年推出,这是恰如其名的“Move 2024”版本的一部分。其中许多更改都是​​对源语言的增强,影响编译器,而无需对链上发布的二进制表示进行任何更改。

这些变化的主要目标是让 Move 更易于编写,也更易于阅读。对源语言引入的相对较少的重大变化是为了让 Move 更好地应对未来的发展。

即使添加了这些新功能,现有代码仍可继续编译。由于这些功能是可选的,因此即使依赖项没有,您也可以使用新功能编写软件包。但是,选择利用当前模块中的新功能确实会带来一些重大变化。

本文档重点介绍了一些值得尝试的新功能,并展示了如何迁移现有模块以使用 Move 2024。

信息

请通过GitHubDiscordTelegram提供任何反馈或报告您遇到的任何问题。

如何迁移

要将项目迁移至 Move 2024 Beta:

  1. 删除现有Move.lock文件(如果存在)以确保您使用的是最新sui-framework版本。

  2. 执行以下操作之一:

    • sui move migrate在 Move 项目的根目录中运行。请参阅自动迁移
    • 或者,更新Move.toml文件的[package]条目以包含edition = "2024.beta"。如果执行此操作,您可能会收到许多与重大更改相关的新错误。

自动迁移

Move 2024 包含一个自动迁移脚本,您可以通过sui move migrate在 Move 项目的根目录中调用来使用它。运行时,控制台会提示您使用哪个 Move 版本。如果您选择2024.beta,脚本会调用编译器并尝试自动更新代码,以避免更新引入的重大更改public(包括将结构标记为、使用关键字的可变变量、避免使用受限关键字、将smut替换为,甚至在许多情况下将路径更新为全局路径)。friend``public(package)

完成此操作后,您的控制台将显示脚本要进行的更改的差异。如果您接受更改,脚本将Move.toml自动更新您的代码和文件。您现在正在使用 Move 2024 Beta。

更新 IDE支持

使用新的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)可见性修饰符,它只允许在定义它们的同一包中调用函数。

位置字段

现在,您可以使用位置字段定义structs,这些字段可通过从零开始的索引进行访问。例如,

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 &lt; 10) {
    while (j &lt; 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 &lt; 10) {
    while (j &lt; 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 &lt; 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-->

  • 原创
  • 学分: 13
  • 分类: Sui
  • 标签: Move 
点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Alan
Alan
0x9cAD...0097
区块链BTC、ETH、BNB