{"content":{"title":"4.轻松入门Sui Move: 基础语法","body":"本章将介绍Sui Move的基础语法。\r\n\r\n### 基本类型\r\n\r\nMove语言是一个强调数据类型的语言，在声明任何变量时，必须将该变量定义为一种数据类型。Move中的数据类型包括基本数据类型和自定义类型（也就是结构体）。结构体不属于本章所讲述的内容，本章主要介绍数据的基本类型。Move程序中，总共有三种基本类型：其中包括整型、布尔型和地址。\r\n\r\n#### 整型\r\n\r\n整型有分五种，分别是u8,u32,u64,u128,u256。u代表unsigned说明不支持负数,u后面的数字代表可以存储的位数，也可以根据这个位数，推算出能存储的最大值：\r\n\r\n| 类型 | 最小值 | 最大值                    |\r\n| ---- | ------ | ------------------------- |\r\n| u8   | 0      | 255                       |\r\n| u32  | 0      | 4294967295                |\r\n| u64  | 0      | 18446744073709551615      |\r\n| u128 | 0      | 3.4028236692093846346e+38 |\r\n| u256 | 0      | 1.1579208923731619542e+77 |\r\n\r\n注意：基本类型只支持正整数，负数将会导致编译报错。\r\n\r\n\r\n\r\n两个不同类型的正整数，要比较大小怎么办呢？可以使用as做类型转换后在进行比较，如下：\r\n\r\n```rust\r\npublic fun compare() :bool {\r\n\tlet a:u8 = 10;\r\n    let b:u32 = 30;\r\n\r\n    (a as u32) >= b\r\n}\r\n```\r\n\r\n#### 布尔型\r\n\r\n布尔类型使用bool表示，值有两个true和false。\r\n\r\n#### 地址\r\n\r\n地址类型用于标识区块链中的地址，如果引入包的包地址、钱包地址或者发送方地址。\r\n\r\n地址一般是0x开头，代表十六进制数。\r\n\r\n### 注释\r\n\r\n像大多数编程语言，注释分为单行注释和多行注释。\r\n\r\n```rust\r\n//单行注释\r\n/*\r\n\r\n多行注释\r\n\r\n*/\r\n```\r\n\r\n### 变量\r\n\r\n变量可以使用以下方式声明和初始化:\r\n\r\nlet <VARIABLE> : <TYPE>\r\n\r\n`let <VARIABLE> = <EXPRESSION>`\r\n\r\nlet <VARIABLE> : <TYPE> = <EXPRESSION>\r\n\r\n```rust\r\nlet a:u8;\r\nlet a=10;\r\nlet a:u8=10;\r\nlet a=true;\r\nlet a=0x0\r\n```\r\n\r\n如果直接对变量赋值正整数，不指定类型，默认类型是u64\r\n\r\n```rust\r\nlet a=10;//a类型是u64\r\n```\r\n\r\nMove不允许申明变量之后不使用。我们可以使用_去标记该变量不使用：\r\n\r\n```rust\r\npublic fun compare() :bool {\r\n\tlet a = 10;\r\n    let b = 10;\r\n    let _ = returnNum(); //丢弃函数返回值\r\n    a > b\r\n}\r\npublic fun returnNum():u64 {\r\n    13\r\n}\r\n```\r\n\r\n#### 变量作用域\r\n\r\n变量的作用域用一句话就能描述清楚：变量只在声明它的代码块中生效，代码块结束变量就无效。代码块由花括号标记，模块的花括号代表一个代码块，函数的花括号也是一个代码块。\r\n\r\n```rust\r\n//参数a,b作用域：整个函数代码块\r\npublic fun varLifetimes(a:u8, b:u8) :bool {\r\n\tlet c = a + b;//变量c作用域：整个函数代码块\r\n    if (c > 10) {\r\n        let d = 12; //变量d作用域：if{}内\r\n        _ = d;\r\n    } else {\r\n        let e = 13;//变量e作用域：else{}内\r\n        _ = e;\r\n    };\r\n    {\r\n    \tlet f=1;//变量f作用域：{}内\r\n        _ = f;\r\n     };\r\n\r\n     c > 100\r\n}\r\n```\r\n\r\n### 常量\r\n\r\n使用const关键字 申明一个常量，常量用大写字母和下划线组成。值可以是基本类型、数组和一部分表达式。\r\n\r\n值得注意的是，常量只能模块内部访问！\r\n\r\n```rust\r\nconst LEVEL:u64=10;\r\n```\r\n\r\n### 流程控制\r\n\r\n任何一门语言都需要基本的流程控制语句，其思想也符合人类判断问题或做事的逻辑过程。什么是流程控制呢？流程就是做一件事情的顺序。在程序设计中，流程就是要完成一个功能，而流程控制则是指如何在程序设计中控制完成某种功能的顺序。\r\n\r\n###### 条件语句\r\n\r\n在现实生活中，经常听人说：如果中彩票了，我就...。其实这就是程序设计中所说的条件语句。例如“如果……就……”“否则……”\r\n\r\n在Move中的if语法是：\r\n\r\n```move\r\nif (<bool_expression>) <expression> else <expression>;\r\n```\r\n\r\nif语句的几种形式：\r\n\r\n```rust\r\nlet i = 10;\r\n//单行不加花括号\r\nif (i > 5) i = i + 1;\r\n//多行要加花括号\r\nif (i > 5) {\r\n\ti = i + 1;\r\n};\r\n//if...else\r\nif (i > 5) {\r\n\ti = i + 1;\r\n} else {\r\n\ti = i - 1;\r\n};\r\n```\r\n\r\n注意: 跟大多数语言不同的是，这里最后一个表达式后加了分号代表结束。\r\n\r\n#### 循环语句\r\n\r\n- while循环：有条件的循环\r\n\r\n  ```rust\r\n   //满足条件才会循环\r\n   while (i < 5) {\r\n       i = i + 1;\r\n   };\r\n  ```\r\n\r\n- loop循环：无条件循环\r\n\r\n  无条件循环如果内部没有使用break跳出循环，会一直循环下去，也就是所谓的死循环。\r\n\r\n  ```rust\r\n  //这个代码与while中的示例代码作用一样\r\n  loop {\r\n  \tif (i >= 5) {\r\n  \t\tbreak;\r\n  \t};\r\n  }\r\n  ```\r\n\r\n- continue\r\n\r\n  continue代表跳过本次循环，进入下一个循环。break则是结束循环，这俩需要注意区分。\r\n\r\n### 退出语句\r\n\r\n如果程序满足某些条件就要停止运行，可以使用关键字abort\r\n\r\n也可以使用封装好的内建函数assert\r\n\r\n```rust\r\n//这两行代码是等价的\r\nif (i > 5) abort 0;\r\nassert(i <= 5, 0);\r\n```\r\n\r\n### 函数\r\n\r\n函数结构：\r\n\r\n```rust\r\nfun function_name(arg1: u64, arg2: bool): (u8, bool){\r\n\t//函数体\r\n}\r\n```\r\n\r\n函数名由小写字母和下划线组成\r\n\r\n#### 函数返回值\r\n\r\n使用return + 返回值，可以结束函数执行并返回数据，如果是最后一行返回则可以缺省return关键字。如下：\r\n\r\n```rust\r\npublic fun compare(a: u64, b: u64): u8 { \r\n\tif (a == b ) {\r\n        return 0 //中断函数执行，直接返回\r\n     };\r\n     //最后一个表达式，可以无return返回  \r\n     if (a > b) {\r\n        1\r\n      } else {\r\n        2 \r\n      }\r\n}\r\n```\r\n\r\n值得注意的是，无论是何种返回方式，表达式最后都没有逗号\r\n\r\n\r\n\r\nSui Move支持多个返回值，多个返回值的返回和使用，详见代码：\r\n\r\n```rust\r\npublic fun call_return_nums(): u64{\r\n        let (a,b) = return_nums();//接收多个函数返回值，必须有括号\r\n        if (b) {\r\n            a\r\n        } else {\r\n            0    \r\n        }\r\n    }\r\n    public fun return_nums():(u64, bool) {//多个返回值的申明方法\r\n        (19, true)//返回多个函数返回值，必须有括号\r\n    }\r\n```\r\n\r\n\r\n\r\n了解更多Sui Move内容：\r\n\r\n- telegram: t.me/move_cn\r\n- QQ群: 79489587"},"author":{"user":"https://learnblockchain.cn/people/18898","address":null},"history":null,"timestamp":1711520043,"version":1}