Move简明教程(2)【模块与脚本】

    Move 有两种不同类型的程序: 模块和脚本。模块是定义结构类型以及操作这些类型的函数的库。结构类型定义 Move 的全局存储模式,模块函数定义更新存储的规则。模块本身也存储在全局存储中。脚本是类似于传统语言中的主函数的可执行入口点。脚本通常调用已发布模块的函数对全局存储进行更新。脚本是不在全局存储中发布的临时代码段。
    Move的源文件(或编译单元)可能包含多个模块和脚本。但是,发布模块或执行脚本是独立的 VM 操作。

一、脚本
    脚本具有如下结构:

script {
    <use>*
    <constants>*
    fun <identifier><[type parameters: constraint]*>([identifier: type]*) <function_body>
}

    脚本块必须以它的所有 use 声明开始,然后是任何常量和(最后)主函数声明。Main 函数可以有任何名称(也就是说,它不需要被称为 main) ,是脚本块中唯一的函数,可以有任意数量的参数,并且不能有返回值。下面是每个组件的示例:

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)、结构类型或访问全局存储。它们的主要用途是调用模块函数。

二、 模块
    模块具有以下语法:

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 将在全局存储中的账户地址0x42下发布。模块也可以使用命名地址声明。例如:

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)
    }
}

    因为命名地址只存在于源语言级别和编译期间,所以在字节码级别,命名地址将完全被它们所代表的值所取代。例如,如果我们有以下代码:

script {
    fun example() {
        MyAddr::M::foo(@MyAddr);
    }
}

    然后我们将 MyAddr 设置为0xC0FFEE,那么它将等效于下面的操作:

script {
    fun example() {
        0xC0FFEE::M::foo(@0xC0FFEE);
    }
}

    但是在源代码级别,这两个函数是不等价的ーー函数 M: : foo 必须通过 MyAddr 命名的地址来访问,而不是通过分配给该地址的数值来访问。模块名称可以以字母 a 到 z 或字母 A 到 Z 开头。在第一个字符之后,模块名称可以包含下划线 _、字母 a 到 z、字母 A 到 Z 或数字0到9。

module my_module {}
module FooBar42 {}

    通常,模块名称以大写字母开头。一个名为 MyModule 的模块应该存储在一个名为 MyModule.move 的源文件中。
    模块块内的所有元素可以以任意顺序出现。基本上,模块是类型和函数的集合。Uses关键字可以声明来自其他模块的导入类型,使用Friends可以指定受信任模块的列表,Constants可以定义该模块函数中使用的私有常量。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容