Move 2024全新升级,新版增加枚举和宏函数等功能

Sui的原生编程语言Move将在2024年初推出新功能,包括Enums、宏函数和Method语法等突破性更新。

Move 2024全新升级,新版增加枚举和宏函数等功能

Move计划于2024年初推出新版,2024版将增加枚举Enums、宏函数、Method语法等功能。这些重要的新功能为Move编程语言引入了新的定义数据和调用函数的方式,使在Sui上构建应用程序更加灵活,并符合当前编程语言的最新期望。

Move是Sui的原生编程语言,允许开发人员编写高效而富有表现力的代码。由Mysten Labs的联合创始人兼首席技术官Sam Blackshear设计,这种以智能合约为重点的编程语言充分利用了Sui的可扩展性和高吞吐量环境。

Move 2024版在更新中引入了枚举Enums、宏函数、Method语法等新功能,使其更加强大。作为开源项目,Move和Sui允许社区不断进行改进。 

Move重大更新 

以下功能将首先在Alpha版本中提供测试,然后加入发布候选并最终发布。

方法语法Method syntax

Method语法是一种语法转换,允许在值上调用函数,而不是直接从模块调用。这个改变极大地提高了在Move中编程的便利性。

例如:

let c2: Coin<SUI> = c.withdraw(10);

升级后:

let c2: Coin =sui::coin::withdraw(&mut c, 10);

新的语法 use fun将用于添加公共或内部方法的别名。此功能可用于创建一个别名以重命名方法,或者用于在关联类型定义模块之外创建本地Method别名。

索引语法Index syntax

在Method语法的基础上,Index语法添加了访问索引的代码,具体的代码取决于访问类型。暂时而言,这些代码如下:

&x[i] expands to x.borrow(i)
&mut x[i] expands to x.borrow_mut(i)
x[i] expands to *x.borrow(i)
x[i] = v expands to x.assign(i, v)             

宏函数

高阶函数,如 map, filter, foldfor_each,在许多语言中用于简洁地转换集合。Move没有 lambdas, closures函数指针,这使得在运行时不可能定义这些操作。

宏函数允许Move模仿这些类型的操作,而无需在运行时支持这种行为。模仿高阶函数的宏的主体将在每个调用站点内联,调用站点可以提供一个在宏展开时替代的lambda。 

例如:

let v2 = v.map!(|x| x + 1);

v.for_each!(|x| foo(x));

lambdas将通过以下方式支持控制流 breakreturn.

枚举

枚举 枚举允许开发者定义一种单一类型,该类型可能包含多种不同形状的数据。与总是具有相同字段的结构不同,枚举可以根据枚举的变体具有不同的字段。例如,在 enum Option<T> { None, Some(T) }中,变体 None 没有字段,而变体 Some 具有单个字段,其类型为 T.

Move将允许使用匹配表达式对枚举进行解构。Move中的一些枚举示例如下:

public enum Color {
    RGB { red: u8, green: u8, blue: u8 },
    HSL { hue: u16, saturation: u8, lightness: u8 },
    Hex(u32)
}
public enum Option<T> {
    None,
    Some(T),
}
public fun is_rgb_color(color: Color): bool {
    match (color) {
        Color::RGB{ .. } => true,
        _ => false,
    }
}
const EOptionIsNone: u64 = 0;
public fun unwrap_some<T>(option: Option<T>): T {
    match (option) {
        Option::Some(x) => x,
        Option::None => abort EOptionIsNone,
    }
}

尽管枚举是Move 2024版本的一部分,但它们不会立即在Sui主网上线。相反,该功能将首先在开发网上启动,然后是测试网,一旦在环境中测试合适,最后会上线主网。 

其他新功能

除上述显示的功能之外,Move 2024版本还包括一些较小的额外更新,例如消除显式友元声明的需要,并允许 break 带有一个值。路线图中详细说明了这些更新背后的原因和示例。总体上,它们旨在未来保护Move并提高编码体验的效率。

重大变更

Move的一些计划中更新将影响现有代码。在这里列出的三个更新中,大多数需要更明确的代码,例如,如果为局部变量分配了或以可变方式借用了,则需要包括 mut 注释。 

结构声明

目前,结构声明只能是 public,因此不需要包含可视性修饰符。为了为未来的结构类型具有除 public之外的可视性留出空间,Move 2024版本将要求在所有结构声明中使用 public

mut注释

目前,在Move中,所有局部变量都可以进行分配 x = e 和可变借用 &mut x。在进行修改或可变借用之前,变量不需要在 mut 注释的情况下进行注释,因为开发人员始终可以在本地查看以检查分配或可变借用。然而,上述新的Method语法将在某些情况下自动借用本地变量。 

为了在存在Method调用的情况下提高可读性和可理解性,Move 2024版本将要求在对局部变量进行分配或可变借用时添加 mut 注释。

新关键字

Move 2024版本增加了先前作为标识符接受的新关键字。新关键字包括:

  • mut
  • enum
  • type
  • match

为了帮助迁移具有这些名称的现有字段、函数或局部变量,新语法允许开发人员将关键字用作标识符。例如:

let `type` = 0; `type` + 1

简而言之,可以通过用反引号括起来的方式将任何关键字用作标识符,例如 `type`。

测试和发布

Move 2024版本将以审慎的方式推出,让开发人员测试新功能并相应地更新现有代码。开发人员可以通过指定 edition = "2024.alpha" 根据 [package] 部分下)来开始测试alpha版本。在alpha版本下发布的功能将不稳定,可能无法编译。

在这些新功能变得相对稳定且引入了突破性更新后,将发布候选版本。与alpha版本一样,开发人员可以通过指定 edition = "2024.rc" 根据 [package] 部分下)来测试候选版本。 

尽管候选版本相对于alpha版本更为稳定,但未来可能会发生一些小的突破性更新。在今年初,可能在三月初,当编译器构建项目时,将询问开发人员是否要迁移到候选版本。然后,自动工具将迁移项目到新版,添加Move.toml中的版本标记并自动修复所有突破性更新。

今年晚些时候,2024版本的Move更新将从候选版本推进, edition = "2024" 将成为所有新的Move包的默认版本。