? ? Move 有兩種不同類型的程序: 模塊和腳本。模塊是定義結(jié)構(gòu)類型以及操作這些類型的函數(shù)的庫群扶。結(jié)構(gòu)類型定義 Move 的全局存儲(chǔ)模式,模塊函數(shù)定義更新存儲(chǔ)的規(guī)則。模塊本身也存儲(chǔ)在全局存儲(chǔ)中克婶。腳本是類似于傳統(tǒng)語言中的主函數(shù)的可執(zhí)行入口點(diǎn)。腳本通常調(diào)用已發(fā)布模塊的函數(shù)對(duì)全局存儲(chǔ)進(jìn)行更新丹泉。腳本是不在全局存儲(chǔ)中發(fā)布的臨時(shí)代碼段情萤。
? ? Move的源文件(或編譯單元)可能包含多個(gè)模塊和腳本。但是摹恨,發(fā)布模塊或執(zhí)行腳本是獨(dú)立的 VM 操作筋岛。
一、腳本
? ? 腳本具有如下結(jié)構(gòu):
script {
<use>*
<constants>*
fun <identifier><[type parameters: constraint]*>([identifier: type]*) <function_body>
}
? ? 腳本塊必須以它的所有 use 聲明開始晒哄,然后是任何常量和(最后)主函數(shù)聲明睁宰。Main 函數(shù)可以有任何名稱(也就是說肪获,它不需要被稱為 main) ,是腳本塊中唯一的函數(shù)柒傻,可以有任意數(shù)量的參數(shù)孝赫,并且不能有返回值邓厕。下面是每個(gè)組件的示例:
script {
// Import the Debug module published at the named account address Std.
use Std::Debug;
const ONE: u64 = 1;
fun main(x: u64) {
let sum = x + ONE;
Debug::print(&sum)
}
? ? 腳本的能力非常有限ーー它們不能聲明好友(Friends)社露、結(jié)構(gòu)類型或訪問全局存儲(chǔ)。它們的主要用途是調(diào)用模塊函數(shù)映胁。
二预侯、 模塊
? ? 模塊具有以下語法:
module <address>::<identifier> {
(<use> | <friend> | <type> | <function> | <constant>)*
}
? ? 其中 < address > 是有效的命名地址或文字地址致开。例如:
module 0x42::Test {
struct Example has copy, drop { i: u64 }
use Std::Debug;
friend 0x42::AnotherTest;
const ONE: u64 = 1;
public fun print(x: u64) {
let sum = x + ONE;
let example = Example { i: sum };
Debug::print(&sum)
}
}
? ? "module 0x42::Test"部分表示模塊 Test 將在全局存儲(chǔ)中的賬戶地址0x42下發(fā)布。模塊也可以使用命名地址聲明萎馅。例如:
module TestAddr::Test {
struct Example has copy, drop { a: address}
use Std::Debug;
friend TestAddr::AnotherTest;
public fun print() {
let example = Example { a: @TestAddr};
Debug::print(&example)
}
}
? ? 因?yàn)槊刂分淮嬖谟谠凑Z言級(jí)別和編譯期間双戳,所以在字節(jié)碼級(jí)別,命名地址將完全被它們所代表的值所取代糜芳。例如飒货,如果我們有以下代碼:
script {
fun example() {
MyAddr::M::foo(@MyAddr);
}
}
? ? 然后我們將 MyAddr 設(shè)置為0xC0FFEE,那么它將等效于下面的操作:
script {
fun example() {
0xC0FFEE::M::foo(@0xC0FFEE);
}
}
? ? 但是在源代碼級(jí)別耍目,這兩個(gè)函數(shù)是不等價(jià)的ーー函數(shù) M: : foo 必須通過 MyAddr 命名的地址來訪問膏斤,而不是通過分配給該地址的數(shù)值來訪問。模塊名稱可以以字母 a 到 z 或字母 A 到 Z 開頭邪驮。在第一個(gè)字符之后莫辨,模塊名稱可以包含下劃線 _、字母 a 到 z毅访、字母 A 到 Z 或數(shù)字0到9沮榜。
module my_module {}
module FooBar42 {}
? ? 通常,模塊名稱以大寫字母開頭喻粹。一個(gè)名為 MyModule 的模塊應(yīng)該存儲(chǔ)在一個(gè)名為 MyModule.move 的源文件中蟆融。
? ? 模塊塊內(nèi)的所有元素可以以任意順序出現(xiàn)∈匚兀基本上型酥,模塊是類型和函數(shù)的集合。Uses關(guān)鍵字可以聲明來自其他模塊的導(dǎo)入類型查乒,使用Friends可以指定受信任模塊的列表弥喉,Constants可以定義該模塊函數(shù)中使用的私有常量。