move语言之基础学习(基本类型+表达式+变量)例子

news2024/11/16 6:29:32

一、基本类型

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

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

整型
整型包括 u8、u64 和 u128,我们通过下面的例子来理解整型:

script {
fun main() {
// define empty variable, set value later
let a: u8;
a = 10;

    // define variable, set type
    let a: u64 = 10;

    // finally simple assignment
    let a = 10;

    // simple assignment with defined value type
    let a = 10u128;

    // in function calls or expressions you can use ints as constant values
    if (a < 10) {};

    // or like this, with type
    if (a < 10u8) {}; // usually you don't need to specify type
} }

运算符as
当需要比较值的大小或者当函数需要输入不同大小的整型参数时,你可以使用as运算符将一种整型转换成另外一种整型:

script {
fun main() {
let a: u8 = 10;
let b: u64 = 100;

    // we can only compare same size integers
    if (a == (b as u8)) abort 11;
    if ((a as u64) == b) abort 11;
} }

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

script {
fun main() {
// these are all the ways to do it
let b : bool; b = true;
let b : bool = true;
let b = true
let b = false; // here’s an example with false
} }

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

script {
fun main() {
let addr: address; // type identifier

    // in this book I'll use {{sender}} notation;
    // always replace `{{sender}}` in examples with VM specific address!!!
    addr = {{sender}};

    // in Diem's Move VM and Starcoin - 16-byte address in HEX
    addr = 0x...;

    // in dfinance's DVM - bech32 encoded address with `wallet1` prefix
    addr = wallet1....;
} }

二、表达式和作用域

在编程语言中,表达式是具有返回值的代码单元。有返回值的函数调用是一个表达式,它有返回值;整型常数也是一个表达式,它返回整数;其它表达式依此类推。

表达式必须用分号";"隔开

空表达式
类似于 Rust,Move 中的空表达式用空括号表示:

script {
fun empty() {
() // this is an empty expression
} }

文字(Literal)表达式
下面的代码,每行包含一个以分号结尾的表达式。最后一行包含三个表达式,由分号隔开。

script {
fun main() {
10;
10 + 5;
true;
true != false;
0x1;
1; 2; 3
} }

现在我们已经知道了最简单的表达式。但是为什么我们需要它们?以及如何使用它们?这就需要介绍 let 关键字了。

变量和let关键字
关键字 let 用来将表达式的值存储在变量中,以便于将其传递到其它地方。我们曾经在基本类型章节中使用过 let,它用来创建一个新变量,该变量要么为空(未定义),要么为某表达式的值。

script {
fun main() {
let a;
let b = true;
let c = 10;
let d = 0x1;
a = c;
} }

关键字 let 会在当前作用域内创建新变量,并可以选择初始化此变量。该表达式的语法是:let : ;或let = 。

创建和初始化变量后,就可以使用变量名来修改或访问它所代表的值了。在上面的示例中,变量 a 在函数末尾被初始化,并被分配了一个值 c。

等号"="是赋值运算符。它将右侧表达式赋值给左侧变量。示例:a = 10 表示将整数10赋值给变量a。

整型运算符
Move具有多种用于修改整数值的运算符:

在这里插入图片描述
下划线 “_” 表示未被使用
Move 中每个变量都必须被使用,否则代码编译不会通过, 因此我们不能初始化一个变量却不去使用它。但是你可以用下划线来告诉编译器,这个变量是故意不被使用的。

例如,下面的脚本在编译时会报错:

script {
fun main() {
let a = 1;
} }

报错:
┌── /scripts/script.move:3:13 ───
│ 33 │ let a = 1;
│ ^ Unused assignment or binding for local ‘a’. Consider removing or replacing it with ‘_’

编译器给出明确提示:用下划线来代替变量名。

script {
fun main() {
let _ = 1;
} }

屏蔽
Move 允许两次定义同一个的变量,第一个变量将会被屏蔽。但有一个要求:我们仍然需要"使用"被屏蔽的变量。

script {
fun main() {
let a = 1;
let a = 2;
let _ = a;
} }

在上面的示例中,我们仅使用了第二个a。第一个a实际上未使用,因为a在下一行被重新定义了。所以,我们可以通过下面的修改使得这段代码正常运行。

script {
fun main() {
let a = 1;
let a = a + 2;
let _ = a;
} }

块表达式
块表达式用花括号"{}"表示。块可以包含其它表达式(和其它代码块)。函数体在某种意义上也是一个代码块。

script {
fun block() {
{ };
{ { }; };
true;
{
true;

        { 10; };
    };
    { { { 10; }; }; };
} }

作用域
如 Wikipedia 中所述,作用域是绑定生效的代码区域。换句话说,变量存在于作用域中。Move 作用域是由花括号扩起来的代码块,它本质上是一个块。

定义一个代码块,实际上是定义一个作用域。

script {
fun scope_sample() {
// this is a function scope
{
// this is a block scope inside function scope
{
// and this is a scope inside scope
// inside functions scope… etc
};
};

    {
        // this is another block inside function scope
    };
} }

从该示例可以看出,作用域是由代码块(或函数)定义的。它们可以嵌套,并且可以定义多个作用域,数量没有限制。

变量的生命周期和可见性
我们前面已经介绍过关键字 let 的作用,它可以用来定义变量。有一点需要强调的是,该变量仅存在于变量所处的作用域内。也就是说,它在作用域之外不可访问,并在作用域结束后立即消亡。

script {
fun let_scope_sample() {
let a = 1; // we’ve defined variable A inside function scope

    {
        let b = 2; // variable B is inside block scope

        {
            // variables A and B are accessible inside
            // nested scopes
            let c = a + b;

        }; // in here C dies

        // we can't write this line
        // let d = c + b;
        // as variable C died with its scope

        // but we can define another C
        let c = b - 1;

    }; // variable C dies, so does C

    // this is impossible
    // let d = b + c;

    // we can define any variables we want
    // no name reservation happened
    let b = a + 1;
    let c = b + 1;

} // function scope ended - a, b and c are dropped and no longer accessible }

变量仅存在于其作用域(或代码块)内,当作用域结束时变量随之消亡。

块返回值
上面我们了解到代码块是一个表达式,但是我们没有介绍为什么它是一个表达式以及代码块的返回值是什么。

代码块可以返回一个值,如果它后面没有分号,则返回值为代码块内最后一个表达式的值。

script {
fun block_ret_sample() {

    // since block is an expression, we can
    // assign it's value to variable with let
    let a = {

        let c = 10;

        c * 1000  // no semicolon!
    }; // scope ended, variable a got value 10000

    let b = {
        a * 1000  // no semi!
    };

    // variable b got value 10000000

    {
        10; // see semi!
    }; // this block does not return a value

    let _ = a + b; // both a and b get their values from blocks
} }

代码块中的最后一个表达式(不带分号)是该块的返回值。

体验后总结:

1.每个表达式都必须以分号结尾,除非它是 block 的返回值。
2.关键字 let 使用值或表达式创建新变量,该变量的生命周期与其作用域相同。
3.代码块是一个可能具有也可能没有返回值的表达式。

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

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

相关文章

python(0)计算机基础知识

文章目录计算机是什么计算机的组成计算机的使用方式windows的命令行文本文件和字符集乱码计算机是什么 在现实生活中&#xff0c;越来越无法离开计算机了 电脑、笔记本、手机、游戏机、汽车导航、智能电视。。。 计算机就是一个用来计算的机器 目前来讲&#xff0c;计算机只…

C++模板进阶+继承详解

耕耘和收获不是连贯的&#xff0c;中间还隔着很长一段时间&#xff0c;那就是坚持&#xff01;一&#xff1a;模板进阶1.1&#xff1a;非类型模板参数template<class T,size_t N> class arr { private:T _a[N]; };这里的N就跟define一样&#xff0c;属于非类型模板参数。…

MongoDB常用操作

官网地址&#xff1a;https://www.mongodb.com/docs/manual/reference/method/Date/ 实例&#xff1a;系统上运行的进程及节点集&#xff0c;一个实例可以有多个库&#xff0c;默认端口 27017。如果要在一台机器上启动多个实例&#xff0c;需要设置不同端口和不同的dbpath。库&…

第四章web服务器之httpd

文章目录第四章 web服务器1.1 www简介1.1.1 网址及HTTP简介1.1.2 HTTP协议请求的工作流程1.2 www服务器的类型1.2.1 仅提供用户浏览的单向静态网页1.2.2 提供用户互动接口的动态网站1.3 www服务器的基本配置1.4 实验1.4.1 搭建静态网站——基于http协议的静态网站1.4.2 搭建静态…

Acwing---1211.蚂蚁感冒

蚂蚁感冒1.题目2.基本思想3.代码实现1.题目 长 100 厘米的细长直杆子上有 nnn 只蚂蚁。 它们的头有的朝左&#xff0c;有的朝右。 每只蚂蚁都只能沿着杆子向前爬&#xff0c;速度是 1 厘米/秒。 当两只蚂蚁碰面时&#xff0c;它们会同时掉头往相反的方向爬行。 这些蚂蚁中…

C语言基本数据类型(一)

文章目录 前言 一、int类型 二、八进制和十六进制 三、其他整数类型 四、char 类型 五、_Bool 类型 六、 可移植类型&#xff1a;stdint.h和unttypes.h 前言 C语言基本数据类型包括声明变量、如何表示字面值常量&#xff0c;以及经典的用法。 一、int类型 C语言中包括许…

【openGauss】在openEuler(ARM架构)上安装openGauss(一主一备)

一、系统版本介绍 当前案例中的openGauss安装&#xff0c;底层操作系统为openEuler-20.03-LTS版本&#xff0c;当前openGauss对Python版本兼容性最好的是Python 3.6版本与Python 3.7版本&#xff0c;该实验使用的openEuler版本自带Python 3.7.4&#xff0c;不需要再自行安装 二…

零基础如何入门网络安全?2023年最新,建议收藏!

前言 最近收到不少关注朋友的私信和留言&#xff0c;大多数都是零基础小友入门网络安全&#xff0c;需要相关资源学习。其实看过的铁粉都知道&#xff0c;之前的文里是有过推荐过的。新来的小友可能不太清楚&#xff0c;这里就系统地叙述一遍。 01.简单了解一下网络安全 说白…

前端必会手写面试题合集

实现Event(event bus) event bus既是node中各个模块的基石&#xff0c;又是前端组件通信的依赖手段之一&#xff0c;同时涉及了订阅-发布设计模式&#xff0c;是非常重要的基础。 简单版&#xff1a; class EventEmeitter {constructor() {this._events this._events || ne…

电力系统IEEE33节点Simulink仿真研究(Matlab实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

arduino基本知识认识和学习资源

个人对ardunio的感觉 **像是一个模块化功能的单片机&#xff0c;编程时在单片机中就像python在计算机语言的感觉。**硬件方面的功能比较单一依赖于传感器和硬件电路&#xff1b;编程比较简单&#xff0c;所有执行的函数都已经被封装&#xff0c;所以想要成为第一个用这个库吃瓜…

【C语言刷题】猜名次、猜凶手、杨辉三角、杨氏矩阵、字符串左旋、判断是否为左旋子串

目录 一、猜名次 二、猜凶手 三、杨辉三角 解法一&#xff1a; 解法二 四、杨氏矩阵 解法一 解法二 五、字符串左旋 解法一 解法二 六、判断是否为字符串左旋字串 解法一 解法二 总结 一、猜名次 5位运动员参加了10米台跳水比赛&#xff0c;有人让他们预测比赛结果…

基于轻量级CNN开发构建学生课堂行为识别系统

其实早在之前&#xff0c;我的一些文章里面就有做过关于学生课堂行为检测识别的项目&#xff0c;感兴趣的话可以自行移步阅读&#xff1a;《yolov4-tiny目标检测模型实战——学生姿势行为检测》《基于yolov5轻量级的学生上课姿势检测识别分析系统》这些主要是偏目标检测类的项目…

Raft论文阅读

Raft 论文阅读 参考&#xff1a; Raft Paper 一文搞懂Raft算法 - xybaby Raft Demo Raft 实现汇总 Raft 为什么是更易理解的分布式一致性算法 空挡) Raft协议实现之etcd(一)&#xff1a;基本架构 Raft 协议 - buttercup 【raft】学习二&#xff1a;etcd/raft raft数据结构学…

第四十八讲:神州路由器IPv6静态路由配置

实验拓扑图如下所示 配置步骤&#xff1a; 步骤1&#xff1a;配置R1接口 R1_config#ipv6 unicast-routing //启用IPv6路由 R1_config#in g0/4 R1_config-_g0/4#ipv6 address 2001:10::1/64 //手工配置IPv6地址 R1_config-…

LInux背景【Linux】

一、技术推动社会发展的基本动力作为万物之长的人类&#xff0c;我们相较于其他的生物哪里是特殊的&#xff1f;举一个例子&#xff1a;老虎需要几千上万年进化来的爪子&#xff0c;人类可以在更短的时间内通过制造石矛石斧这类工具变可以模拟。通过这一个例子我们得出——人的…

python自学之《21天学通Python》(7)

第10章 Python进阶话题 10.1 函数与命名空间 Python中可以通过模块来管理复杂的程序&#xff0c;而将不同功能的函数分布在不同的模块中&#xff0c;那么函数及其全局命名空间决定了函数中引用全局变量的值。函数的全局命名空间始终是定义该函数的模块&#xff0c;而不是调用该…

java面试之Spring篇

一、Spring概述 1. Spring由哪些模块组成 spring core&#xff1a;提供了框架的基本组成部分&#xff0c;包括控制反转&#xff08;Inversion of Control&#xff0c;IOC&#xff09;和依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;功能。spring beans…

windows无线连接Linux服务器,实现终端操作与文件传输

0、建议安装完Ubuntu后按照百问网的设置安装必要的linux软件 执行&#xff1a; git clone https://e.coding.net/weidongshan/DevelopmentEnvConf.git cd DevelopmentEnvConf sudo ./Configuring_ubuntu.sh 等待安装完成&#xff0c;大约半个小时事件。 我搭建的环境 家…

git的使用

一、创建仓库 gitee官网创建好用户之后&#xff0c;我们点创建仓库。 选择好语言&#xff0c;开源许可证随便选一个即可&#xff0c;模板我们最好设置一个Readme文件&#xff0c;方便后面写明仓库的介绍。 分支模型我们新手选一个单分支模型就可以了。 因为仓库创建的时候只能…