Move 2024版本已上线主网,版本迁移指南了解一下

2024-04-22 22:12

本文主要是介绍Move 2024版本已上线主网,版本迁移指南了解一下,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Move 2024版本迁移引入了一些变化,使得编写Move更加容易,也更容易阅读。源语言中相对较少的重大变化更好地使Move能够处理未来的进展。

这其中的许多变化增强了源语言,影响了编译器,而不需要对发布在链上的二进制表示进行任何更改。

现有的代码将继续编译,即使增加了这些新功能。由于这些功能是可选的,即使您的依赖项不包含它们,您也可以在您的packages中使用新功能进行编写。然而,在当前模块中选择利用新功能引入了一些重大变化。

欢迎阅读我们在GitHub上的迁移指南以获取完整的详细信息。

如何迁移

要将项目迁移到 Move 2024 Beta版本,您有两个选项:

  1. 删除现有的 Move.lock 文件(如果存在),以确保您使用最新的 sui-framework 版本。
  2. 在您的 Move 项目的根目录运行 sui move migrate。有关更多信息,请参阅迁移指南中的自动迁移部分。

或者,更新您的 Move.toml 文件中的 [package] 条目,将 edition = “2024.beta” 包含在内。如果这样做,您可能会因我们的重大变化而收到一些新的错误。

自动迁移

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

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

新功能

以下是 Move 2024 中一些新功能的简要概述。

方法语法Method syntax

现在您可以使用 . 语法将某些函数作为方法调用。例如,以下调用:

vector::push_back(&mut v, coin::value(&c));

现在可以写成:

v.push_back(c.value());

在这个例子中,如果需要,方法的接收者(v 和 c)会自动借用(分别为 &mut v 和 &c)。

如果函数在与接收者类型相同的模块中定义,您可以将其作为方法调用,前提是它将接收者作为其第一个参数。

对于在模块外定义的函数,您可以使用 public use fun 和 use fun 声明方法。

索引语法Index syntax

使用方法语法,您可以将某些函数注释为 #[syntax(index)] 方法。然后,您可以使用 v[i] 形式的调用来调用这些方法。

例如:

*&mut v[i] = v[j];

可以解析为:

*vector::borrow_mut(&mut v, i) = *vector::borrow(&v, j);public(package)

friend 声明以及相关的 public(friend) 可见性修饰符已经过时。取而代之的是 public(package) 可见性修饰符,它只允许在定义它们的同一包中调用函数。

位置字段Positional fields

现在您可以定义具有位置字段的结构,通过以零为基的索引来访问这些字段。例如:

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

现在可以从循环中断中返回值。例如:

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
}

如果尝试在没有此明确声明的情况下重新分配或借用可变变量,则编译器将产生错误。

移除 friends 和 public(friend)

在 Move 的早期开发中引入了 friends 和 public(friend) 可见性,甚至早于包系统。如 public(package) 部分所示,public(package) 在 Move 2024 中取代了 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 Beta 版本除了上述的重大变更外,还带来了一些强大的新功能。未来还将有更多的功能。请加入Sui邮件订阅以了解今年即将推出的 Move 新功能,包括语法宏、带模式匹配的枚举和其他用户定义的语法扩展。

请通过GitHub、Discord或Sui开发者论坛提供任何反馈或报告您遇到的问题。


关于 Sui Network

Sui是基于第一原理重新设计和构建而成的L1公有链,旨在为创作者和开发者提供能够承载Web3中下一个十亿用户的开发平台。Sui上的应用基于Move智能合约语言,并具有水平可扩展性,让开发者能够快速且低成本支持广泛的应用开发。获取更多信息:https://linktr.ee/sui_apac

官网|英文Twitter|中文Twitter|Discord|英文电报群|

中文电报群

这篇关于Move 2024版本已上线主网,版本迁移指南了解一下的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/927000

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

macOS彻底卸载Python的超完整指南(推荐!)

《macOS彻底卸载Python的超完整指南(推荐!)》随着python解释器的不断更新升级和项目开发需要,有时候会需要升级或者降级系统中的python的版本,系统中留存的Pytho版本如果没有卸载干... 目录MACOS 彻底卸载 python 的完整指南重要警告卸载前检查卸载方法(按安装方式)1. 卸载

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Oracle Scheduler任务故障诊断方法实战指南

《OracleScheduler任务故障诊断方法实战指南》Oracle数据库作为企业级应用中最常用的关系型数据库管理系统之一,偶尔会遇到各种故障和问题,:本文主要介绍OracleSchedul... 目录前言一、故障场景:当定时任务突然“消失”二、基础环境诊断:搭建“全局视角”1. 数据库实例与PDB状态2

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py