Move簡(jiǎn)明教程(2)【模塊與腳本】

? ? Move 有兩種不同類(lèi)型的程序: 模塊和腳本。模塊是定義結(jié)構(gòu)類(lèi)型以及操作這些類(lèi)型的函數(shù)的庫(kù)。結(jié)構(gòu)類(lèi)型定義 Move 的全局存儲(chǔ)模式,模塊函數(shù)定義更新存儲(chǔ)的規(guī)則。模塊本身也存儲(chǔ)在全局存儲(chǔ)中。腳本是類(lèi)似于傳統(tǒng)語(yǔ)言中的主函數(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 聲明開(kāi)始,然后是任何常量和(最后)主函數(shù)聲明。Main 函數(shù)可以有任何名稱(chēng)(也就是說(shuō),它不需要被稱(chēng)為 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)類(lèi)型或訪問(wèn)全局存儲(chǔ)。它們的主要用途是調(diào)用模塊函數(shù)。

二、 模塊
? ? 模塊具有以下語(yǔ)法:

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ǔ)中的賬戶(hù)地址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(yǔ)言級(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 必須通過(guò) MyAddr 命名的地址來(lái)訪問(wèn),而不是通過(guò)分配給該地址的數(shù)值來(lái)訪問(wèn)。模塊名稱(chēng)可以以字母 a 到 z 或字母 A 到 Z 開(kāi)頭。在第一個(gè)字符之后,模塊名稱(chēng)可以包含下劃線 _、字母 a 到 z、字母 A 到 Z 或數(shù)字0到9。

module my_module {}
module FooBar42 {}

? ? 通常,模塊名稱(chēng)以大寫(xiě)字母開(kāi)頭。一個(gè)名為 MyModule 的模塊應(yīng)該存儲(chǔ)在一個(gè)名為 MyModule.move 的源文件中。
? ? 模塊塊內(nèi)的所有元素可以以任意順序出現(xiàn)?;旧?,模塊是類(lèi)型和函數(shù)的集合。Uses關(guān)鍵字可以聲明來(lái)自其他模塊的導(dǎo)入類(lèi)型,使用Friends可以指定受信任模塊的列表,Constants可以定義該模塊函數(shù)中使用的私有常量。

原文:https://mp.weixin.qq.com/s/GJM31htRrCFvcLOTPrHasA

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容