sui move笔记

前言

一些疑问:

  • sui 和move是什么关系?

基础

基本数据类型

Move 的基本数据类型包括: 整型 (u8, u32,u64, u128,u258)、布尔型 boolean 和地址 address。

Move 不支持字符串和浮点数。

_u8:代表8位无符号整数类型,范围是0~255。占用内存8位
_u16:代表16位无符号整数类型,范围是0~65535。占用内存16位
_u32:代表32位无符号整数类型,范围是0~4294967295。占用内存32位
_u64:代表64位无符号整数类型,范围是0~18446744073709551615。占用内64位
以此类推

整型

module ch02::int {fun main() {// define empty variable, set value laterlet a: u8;a = 10;let a = 1u32;// define variable, set typelet a: u64 = 10;// finally simple assignmentlet a = 10;// simple assignment with defined value typelet a = 10u64;// in function calls or expressions you can use ints as constant valuesif (a < 10) {};// or like this, with typeif (a < 10u64) {}; // usually you don't need to specify typelet b = 1u256;// or like this, with typeif (b < 10u256) {}; // usually you don't need to specify type}
}

let a = 10 默认不手动标记类型的整型是 u64 类型,也就是等同于 let a:u64 = 10 或者 let a = 10u64

布尔型

布尔类型就像编程语言那样,包含false和true两个值。

module book::boolean {fun main() {// these are all the ways to do itlet b : bool; b = true;let b : bool = true;let b = true;let b = false; // here's an example with false}
}

地址

地址是区块链中交易发送者的标识符,转账和导入模块这些基本操作都离不开地址。

module book::addr {fun main() {let addr: address; // type identifieraddr = @ch02;}
}

模块

模块是发布在特定地址下的打包在一起的一组函数和结构体。
模块以module关键字开头,后面跟随地址::模块名称和大括号,大括号中放置模块内容。

module book::math {public fun sum(a: u64, b: u64): u64 {a + b}
}

注意:

  • 模块在发布者的地址下发布。标准库在 0x1 地址下发布。
  • 发布模块时,不会执行任何函数。要使用模块就得使用脚本。
  • 模块名推荐使用小写
  • 模块是发布代码供他人访问的唯一方法。新的类型和 Resource 也只能在模块中定义。默认情况下,模块将在发布者的地址下进行编译和发布

导入

Move 在默认上下文中只能使用基本类型,也就是整型、布尔型和地址,可以执行的有意义或有用的操作也就是操作这些基本类型,或者基于基本类型定义新的类型。

除此之外还可以导入已发布的模块(或标准库)。

  • 直接导入
module book::m {fun main(a: u8) {std::debug::print(&a);}
}

在此示例中,我们从地址0x1(标准库)导入了 debug 模块,并使用了它的 print 方法

use关键字

要使代码更简洁(注意,0x1 是特殊的地址,实际地址是很长的),可以使用关键字use:

use <address>::<ModuleName>;

这里 </address/> 是模块发布object的地址, 是模块的名字。非常简单,例如,我们可以像下面这样从 0x1 地址导入 vector 模块。

use 0x1::vector;
  • 访问模块的内容

要访问导入的模块的方法(或类型),需要使用::符号。非常简单,模块中定义的所有公开成员都可以通过双冒号进行访问。

module book::m_use {use  std::debug::print;fun main(a: u8) {print(&a);}
}

在模块中导入
在模块中导入模块必须在 module {} 块内进行:

module book::math {use std::vector;// you are free to import any number of modulespublic fun empty_vec(): vector<u64> {let v = vector::empty<u64>();v}
}

成员导入
导入语句还可以进一步被扩展,可以直接导入模块的成员:

module book::m_use2 {// single member importuse sui::tx_context::TxContext;use sui::tx_context::sender;// multi member import (mind braces)use std::vector::{empty,push_back};fun main(ctx: &mut TxContext) {// use functions without module accesslet vec = empty<u8>();push_back(&mut vec, 10);let _ = sender(ctx);}
}

使用 Self 来同时导入模块和模块成员
导入语句还可以进一步扩展,通过使用 Self 来同时导入模块和模块成员,这里 Self 代表模块自己。

module book::m_self {use 0x1::vector::{Self, // Self == Imported moduleempty};fun main() {// `empty` imported as `empty`let vec = empty<u8>();// Self means vectorvector::push_back(&mut vec, 10);}
}

使用 use as
当两个或多个模块具有相同的名称时,可以使用关键字as更改导入的模块的名称,这样可以在解决命名冲突的同时缩短代码长度。

语法:

use <address>::<ModuleName> as <Alias>;
module ch04::m_as1 {use 0x1::vector::{Self as v,empty as empty_vec};fun main() {// `empty` imported as `empty_vec`let vec = empty_vec<u8>();// Self as V = vectorv::push_back(&mut vec, 10);}
}

函数

Move 中代码的执行是通过调用函数实现的。函数以 fun 关键字开头,后跟函数名称、扩在括号中的参数,以及扩在花括号中的函数体。

module book::f01 {fun function_name(arg1: u64, arg2: bool): u64 {// function body10}
}
  • 注意:Move 函数使用snake_case命名规则,也就是小写字母以及下划线作为单词分隔符。

返回值:

module book::math {fun zero(): u8 {0}
}

第一步:我们定义一个 math 模块,它有一个函数:zero(),该函数返回 u8 类型的值 0。0 之后没有分号,因为它是函数的返回值

return关键字:

module book::m {public fun conditional_return(a: u8): bool {if (a == 10) {return true // semi is not put!};if (a < 10) {true} else {false}}
}

多个返回值及解构:

要指定多个返回值,需要使用括号:

module book::math {// ...public fun max(a: u8, b: u8): (u8, bool) {if (a > b) {(a, false)} else if (a < b) {(b, false)} else {(a, true)}}
}

在另一个模块中使用该函数的返回值。

module book::math_use {use book::math::sum;use book::math::max;fun use_max(){let (a,b)= max(1u8,2u8);}
}

上面例子中,我们解构了一个二元组,用函数 max 的返回值创建了两个新变量。

公有、私有方法、friend方法、native本地方法:

默认情况下,模块中定义的每个函数都是私有的,无法在其它模块或脚本中访问。可能你已经注意到了,我们在 Math 模块中定义的某些函数前有关键字 public:

  • 关键字 public 将更改函数的默认可见性并使其公开,即可以从外部访问。
  • 默认情况下函数是私有函数只能在定义它们的模块中访问。
  • 私有函数只能在定义它们的模块中访问。
module book::math {public fun sum(a: u64, b: u64): u64 {a + b}fun zero(): u8 {0}
}

friend 方法:
friend 方法可以指定指定的模板能调用,目前只能在同一个包内生效

module book::friends {friend book::m;public(friend) fun a_less_10(a: u8): bool {if(a < 10u) return true;false}
}

本地方法:
有一种特殊的函数叫做"本地方法"。本地方法实现的功能超出了 Move 的能力,它可以提供了额外的功能。本地方法由 VM 本身定义,并且在不同的VM实现中可能会有所不同。这意味着它们没有用 Move 语法实现,没有函数体,直接以分号结尾。关键字 native 用于标记本地函数,它和函数可见性修饰符不冲突,native 和 public 可以同时使用。

module book::m {native public fun borrow_address(s: &signer): &address;// ... some other functions ...
}

运算符

as

as 在move 中有两个用法:
1.给包取别名

module book::m_as1 {use 0x1::vector::{Self as v,empty as empty_vec};fun main() {// `empty` imported as `empty_vec`let vec = empty_vec<u8>();// Self as V = vectorv::push_back(&mut vec, 10);}
}

2.整型类型转换 语法 (整型A as 整型 B) 当需要比较值的大小或者当函数需要输入不同大小的整型参数时,你可以使用as运算符将一种整型转换成另外一种整型 注意就是括号是一定不能省的

module book::op_as {fun main(){let _a:u64 = (10u8 as u64);let _b:u8 = (a as u8);}
}

+ - * /

注意:

  • 负数做减法一定要检查是否产生负数
  • 做加法乘法注意 溢出报错
  • 除法小心精度丢失问题
  • 得益于Move的安全设计,溢出和负数不会让合约产生安全问题,因为程序会终止运行,但是程序终止会给用户带来不好的体验,代码不是很好调试,建议还是做好溢出边界判断
module book::op_arith {fun main(){let _add_op = 1 + 1;let _mut_op = 1*1;let _minu_op = 100 -1;let _div_op = 100/1;}}

常量

Move 支持模块级常量。常量一旦定义,就无法更改,所以可以使用常量为特定模块或脚本定义一些不变量,例如角色、标识符等。

常量可以定义为基本类型(比如整数,布尔值和地址),也可以定义为数组。我们可以通过名称访问常量,但是要注意,常量对于定义它们的模块来说是本地可见的。

module book::consts {use std::debug;const RECEIVER: address = 0x999;const ErrO1: u64 = 1000fun main(account: &signer) {debug::print<address>(&RECEIVER);let _ = RECEIVER;let _ = ErrO1;}
}

注意:

  • 一旦定义,常量是不可更改的。
  • 常量在模块是本地可见的,不能在外部使用。
  • 可以将常量定义为一个表达式(带有花括号),但是此表达式的语法非常有限。

表达式和作用域

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/673772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】虚拟环境miniconda安装(python3.7, python3.x)

背景 使用Python开发项目时&#xff0c;我们一般都需要安装环境&#xff0c;可能是在物理机上直接安装&#xff0c;也可能是在虚拟环境上安装&#xff0c;当前是怎么按照conda环境的示例&#xff0c;可以指定安装Python3.x的所有版本。 安装 首先&#xff0c;需要登录当前的…

深入对比:java中Synchronized关键字和ReentrantLock锁的终极对决

Synchronized和ReentrantLock在Java中都是用来控制并发访问共享资源的机制&#xff0c;但它们在获取释放锁的方式、锁的特性以及锁的实现级别等方面存在一些差异。 锁的特性 synchronized是Java的关键字&#xff0c;可以隐式地获取和释放锁。synchronized关键字通过内置的锁机…

vue百度地图的和element输入框/v-region的联动

vue百度地图的使用 第一步&#xff1a;安装插件第二步&#xff1a;main.js中引用第三步&#xff1a;页面中使用 第一步&#xff1a;安装插件 npm install vue-baidu-map --save第二步&#xff1a;main.js中引用 // 百度地图 import BaiduMap from vue-baidu-map Vue.use(Baid…

微信小程序(三十九)表单信息收集

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.表单收集的基本方法 2.picker的不足及解决方法 源码&#xff1a; index.wxml <!-- 用户信息 --> <view class"register"><!-- 绑定表单信息收集事件--><form bindsubmit"…

计算两个数相除后的余数返回值为浮点型math.fmod(x, y)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算两个数相除后的余数 返回值为浮点型 math.fmod(x, y) [太阳]选择题 请问以下代码执行math.fmod()后输出的结果是&#xff1f; import math print("【执行】math.fmod(10, 4)"…

sql查询大小写问题

IN() 函数大小敏感判断 如果你在使用 MySQL 的 IN() 函数时发现大小写不敏感&#xff0c;那可能是由于你的 MySQL 数据库的配置设置了大小写不敏感的规则。 这通常是由 lower_case_table_names 参数引起的。在 MySQL 中&#xff0c;这个参数决定了数据库系统在存储和比较表名…

高斯伪谱C++封装库开源!

Windows x64/86 C无依赖运行高斯伪谱法求解最优控制问题&#xff0c;你只需要ElegantGP! Author: Y. F. Zhang His Github: https://github.com/ZYunfeii 写在前面 这个库在你下载它的那一时刻起不再依赖任何其他代码&#xff0c;直接可用来构建C的最优控制问题并进行求解。…

springboot163美食推荐商城的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

C++多线程:this_thread 命名空间

std::this_thread 是 C 标准库中提供的一个命名空间&#xff0c;它包含了与当前线程相关的功能。这个命名空间提供了许多与线程操作相关的工具&#xff0c;使得在多线程环境中更容易进行编程。 源码类似于如下&#xff1a; namespace std{namespace this_thread{//...........…

图片加速接口:缓存图片,加速访问,解决防盗链

CSDN会自动把图片存到自己的图床&#xff0c;测试效果不好&#xff0c;建议到 https://www.skyqian.com/archives/speed-up-picture.html 查看效果。 引言 不知道是否有遇到以下场景&#xff1a; 图片打开很慢&#xff01;因为图片源来自于国外。图片可以正常打开&#xff0c…

在C++的union中使用std::string(非POD对象)的陷阱

struct和union的对比 union最开始是C语言中的关键字&#xff0c;在嵌入式中比较常见&#xff0c;由于嵌入式内存比较稀缺&#xff0c;所以常用union用来节约空间&#xff0c;在其他需要节省内存的地方也可以用到这个关键字&#xff0c;写一个简单程序来说明union的用途 struc…

docker 运行jar包 指定配置文件

要在Docker中运行JAR包并指定配置文件&#xff0c;你可以创建一个Dockerfile来定义你的容器环境&#xff0c;并在其中指定如何运行JAR包和配置文件。下面是一个简单的例子&#xff0c;展示了如何在Dockerfile中设置这些配置&#xff1a; 第一步&#xff1a;创建 Dockerfile文件…

第十个知识点:继承

在ES6之后&#xff0c;javascript引入了类的概念&#xff0c;也就是说与java相同&#xff0c;我们可以在js文件中创建类与对象&#xff0c;然后通过extend继承 <script>class Father {constructor(name) {//父类构造器this.name name;}speak(){//父类方法console.log(我…

生成 Python 项目requirements的最小列表

Python项目中的requirements文件 requirements.txt的格式 在Python项目中&#xff0c;通常会包含一个 requirements.txt 文件&#xff0c;其中列出了项目运行所需的Python库及其版本信息。该文件用于部署Python项目的运行环境&#xff0c;并管理项目的依赖包&#xff0c;以确…

java set集合相关介绍和方法使用操作

在Java中&#xff0c;Set是一种不允许元素重复的集合&#xff0c;它是基于哈希表实现的。Set接口继承自Collection接口&#xff0c;常见的实现类有HashSet、LinkedHashSet和TreeSet。 HashSet是基于哈希表实现的Set&#xff0c;它不保证元素的顺序&#xff0c;存储和访问速度较…

Codeforces Round 923 (Div. 3)E. Klever Permutation 找规律,有共同区间

Problem - E - Codeforces 目录 Source of idea: 思路&#xff1a; 代码&#xff1a; 另一个up的找规律的解法&#xff1a; Source of idea: Codeforces Round 923(A-F题解) - 哔哩哔哩 (bilibili.com) 思路&#xff1a; 上面up分析的很好。两个相邻区间也就端点不一样&…

nginx限制网段访问

文章目录 nginx限制网段访问介绍:使用:示例:介绍网段:nginx限制网段访问 介绍: Nginx的deny和allow指令是由ngx_http_access_module模块提供, Nginx安装默认内置了该模块 使用: nginx访问控制模块: 想禁止哪个ip访问就加上deny IP, 想允许哪个ip访问就加上allow…

使用Pillow来生成简单的红包封面

Pillow库&#xff08;Python Imaging Library的后继&#xff09;是一个强大而灵活的图像处理库&#xff0c;适用于Python。Pillow 库&#xff08;有时也称 PIL 库&#xff09; 是 Python 图像处理的基础库&#xff0c;它是一个免费开源的第三方库&#xff0c;由一群 Python 社区…

List与数组相互转换

文章目录 将 List 转 数组List.toArra()Stream().toArray() 将 数组 转 ListLists.newArrayList()Stream.of() 将 List 转 数组 List.toArra() List<Integer> list Lists.newArrayList(1, 2, 3);// 无需转换类型 --> [1,2,3]Integer[] intArray list.toArray(new I…

掌握Python爬虫的四大组件之Handler(处理器)

源码分享 https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tabBB08J2 在构建高效的Python爬虫时&#xff0c;理解和应用日志组件是至关重要的。在前一章节中&#xff0c;我们探讨了Logger&#xff08;记录器&#xff09;的概念和基础用法。本章节&#xff0c;我们将聚焦于Logge…