狗哥区块链与AI精品内容集@NonceGeek

2025年03月28日更新 75 人订阅
原价: ¥ 20 限时优惠
专栏简介 「造」最关键的是什么?| Hackathon 漫游指南(贰) Why Hackathon?| Hackathon 漫游指南(壹) 设计「众人维护」的 BuidlerBoard | BeWater.xyz Movement 白皮书中文版 Rebuidl RSS 生产因素与反生产因素 | 独立黑客创业手册(陆) 组织 | 独立黑客创业手册(伍) 生产 | 独立黑客创业手册(肆) 销售 | 独立黑客创业手册(叄) 最优先的能力 | 独立黑客创业手册(贰) 为什么从独立黑客开始 | 独立黑客创业手册(壹) Aptos Token Object V2 | Move dApp 极速入门(贰拾肆) 可編程交易塊 | Move dApp 極速入門(貳拾叁) Aptos 密鑰輪換 | Move dApp 極速入門(貳拾貳) Aptos 对象模型 | Move dApp 极速入门(贰拾壹) Aptos Moveflow SDK使用指南 | Move dApp 极速入门(贰拾) Sui 上简单 Swap 的实现 | Move dApp 极速入门(拾玖) 用 Elixir 交互 Aptos | Move dApp 极速入门(拾捌) Sui 链上数据查询 | Move dApp 极速入门(拾柒) SUI 合约测试攻略 | Move dApp 极速入门(拾陆) Sui 数据类型详解 | Move dApp 极速入门(拾伍) Airdropper Contract in Aptos | Move dApp 极速入门(拾肆) Sandwich合约源码解析 | Move dApp 极速入门(拾叁) Sui 极速上手 | Move dApp 极速入门(拾贰) scaffold-aptos 脚手架 | Move dApp 极速入门(拾壹) 对 DID Document 的思考 | Move dApp 极速入门(九) DID中地址聚合器的实现 | Move dApp 极速入门(八) 值的存取应用3.0 | Web3.0 dApp 开发(五) 合约数据类型综述 | Move dApp 极速入门(四) 操作资源 | Move dApp 极速入门(三) 第一个 Move dApp | Move dApp 极速入门(二) Hello Move | Move dApp极速入门(一) Staker | Web3.0 dApp 开发(九) Token 自动售卖机 | Web3.0 dApp 开发(七) SVG NFT 全面实践 | Web3.0 dApp 开发(六) 值的存取应用2.0 | Web3.0 dApp 开发(四) 值的存取应用1.0 | Web3.0 dApp开发(三) Scaffold-eth 快速上手 | Web3.0 dApp 开发(二) eth.build 快速上手 | Web3.0 dApp 开发(一) 1 小时理解比特币系统 【NonceGeek Workshop 0x01总结】基于链上数据生成游戏地图 Remix 完全本地化部署 NFT:实体与虚拟载体的主与辅 | 狗哥的元宇宙思辨(一) Web3Camp 内容大全@NonceGeek 用 Python 创建一条 Pow 区块链(上) 区块链与共识机制演变史 基于 Etherscan 实现 Blockchain Syncer 【论文分享】去中心化社会:寻找 Web3 的灵魂(上) 【论文分享】去中心化社会:寻找 Web3 的灵魂(下) Ted Yin | 2021 年的区块链基础设施将是什么? 0. 公链、联盟链与分布式未来(全文) 基于 Infura 与 Web3py 部署调用 Hello 合约全过程 | 以太坊开发极速入门 太上中的基因设计与Binary | 函数式与区块链(一) 理解以太坊合约数据读取过程 | 函数式与区块链(二) Hello, Ink! | 用 Rust 写智能合约(一) Mapping 数据结构 | 用 Rust 写智能合约(二) 用 Rust 程序和 Webase 交互 | Rust 学习笔记(四) 用 Sqlite 存储 WeId | Rust 学习笔记(五) 链上注册WeId与错误处理 | Rust 学习笔记(六) WeId 链上创建与本地存储的完整闭环 | Rust 学习笔记(七) 以太坊上的核心开发者 Austin | 以太坊上的最佳开发实践 1. FISCO BCOS 开发环境节点搭建全攻略 伪代码简述 ECDSA 签名过程 | 联盟链开发 WeIdentity 源码分析 | 狗哥解码 WeIdentity 源码分析 | 狗哥解码 FISCO BCOS 介绍 | 联盟链开发 给Remix升个级 | 联盟链开发 2. 控制台的安装与使用 3. 【实验】补全一个区块链应用 4. 控制台的Web化 5. Web化控制台2.0:打造团队共用区块链学习平台 6. 使用脚手架快速搭建 Java DApp 【视频+文字】分布式思维 Rebuidl RSS (EN)

合约数据类型综述 | Move dApp 极速入门(四)

  • 李大狗
  • 发布于 2022-09-19 14:37
  • 阅读 2252

本期课程主要介绍Move的基本数据类型以及如何定义Move变量。

作者:Move小王子

出处:https://zhuanlan.zhihu.com/p/55606082

今天听到一个很好的观点,对于普通人来说,对世界最大的贡献是让自己快乐。学习使我快乐。作为Move布道师,帮助别人学习也很快乐。

希望大家不要被面向资源编程这个概念给吓跑了(只是一只纸老虎),坚持学习。当然也不要太急功近利,技多不压身,学的技能多了,就会由量变产生质变。当学不动的时候,想想$1200美刀的时薪还没到手,有什么理由不学呢(开个玩笑)。

在前期的基础课程中,我将继续为大家一些Move的基础知识(后面会有进阶课程,但愿我能坚持下来,我也需要大家的鼓励,才会分泌更多的多巴胺)。前面我给大家介绍了如何安装Move环境,并且用一种简单的方式实现了一个最简版的HelloWorld,你入门了吗?本期课程主要介绍Move的基本数据类型以及如何定义Move变量。

Move基本数据类型和数组

语言嘛,其实都差不多。如果有其他高级语言的编程经验,比如Python、Java、Golang、Rust等等,那么你可以跨过本期内容了。真的没啥可讲的。

Move主要有3类基本数据类型:

  • 整型,其中整型包括 (u8, u64, u128)
  • 布尔型 boolean
  • 地址 address 跟其他语言对比,Move的基本数据类型缺少两种类型:
  • Move没有字符串类型(用二进制来表达嘛)
  • Move没有浮点型(Solidity也没有浮点型,这个其实简单,用整数来代替就可以了),所以在各大Move公链的Framework或者Stdlib中都有一个FixedPoint32.move的模块 另外,Move的基本数据类型还有3个点需要注意的地方:
  • 没有负数(这个其实也简单,用一个bool型表示符号就可以了)
  • 没有u256类型(这个在DeFi里面很重要,记得当时Starcoin跟Libra的Move社区讨论过很久,一直没有通过,最后选择在u128上面进行封装)
  • address虽然是专门的地址类型,但是本质上是整型,所以address能跟整型相互转换(Solidity也是这样的) 这是Move的基本数据类型跟其他高级语言不同的地方。

除了上面提到的基本数据类型,数组也是最常用的数据类型,所以这里把数组也一起讲了。Move的数组类型是vector。关于vector类型有3个需要说明的地方:

  • vector是泛型类型(以后再讲什么是泛型),例如vector或者vector 等等
  • vector是类型,而std::vector是一个Move模块(不是Move语言本身的),std::vector是一些用来操作vector类型数据的函数。所以一定要注意,vector和std::vector虽然有关联,但不是一个东西
  • 在Move官方版本中,操作vector类型的是std::vector,而在一些公链的Stdlib中则是std::Vector,这个也需要格外注意一下

定义Move变量和常量

我们这里以Move官方版本为准,使用上面介绍的这些基本数据类型和数组定义Move变量。

Move是mini版的Rust(开玩笑),Move借鉴了很多Rust的思想。Move在定义变量的时候,也跟Rust一样,使用了let关键字。

  1. 整型变量
//变量定义
let _a:u8 = 1;
let _b: u8;
_b = 10;
let c = 2u64;

// 类型强转
let _d = c as u128;
let _e = c as u8

上面既介绍了整型变量的定义方式,也介绍了如何类型强转。

  1. 布尔型变量
let _flag = true
  1. 地址变量
 let _addr1: address;
 _addr1 = @test_addr;

let _addr2 = 0x1;// 确定的地

这里的地址类型需要注意一下:test_address是在Move.toml文件里面定义好的地址,通过@引用。

image.png

  1. 数组类型
let _hello_world = b"hello_world";// 字符串会根据ASCII转换成u8数组
let _boxes: vector<u64> = std::vector::empty<u64>();// 通过std::vector定义vector<u64>类型的数组

注意一下,数组类型的两个例子很有代表性。

常量

const ADDR: address = @test_addr;
const FASLE: bool = false

常量是通过const关键字定义的,必须放在方法外面定义。

完整代码

我们看一下上面这些例子的完整代码:

script {
    const ADDR: address = @test_addr;
    const FASLE: bool = false;

    fun main() {
        let _a:u8 = 1;
        let _b: u8;
        _b = 10;
        let c = 2u64;

        let _d = (c as u128);
        let _e = (c as u8);

        let _flag = true;

        let _addr1: address;
        _addr1 = @test_addr;

        let _addr2 = 0x1;

        let _hello_world = b"hello_world";
        let _boxes: vector<u64> = std::vector::empty<u64>();
    }
}

这里注意一下变量前面的下划线_,如果定义的变量在后面没有被使用到,编译的时候会抛错,使用_表示你知道后面没被使用,在内存中可以快速回收掉,编译器在编译的时候不会报错。这也是Rust的风格。

最后,编译一下代码:

move buil

image.png

跟我学Move

好了,今天主要是教大家Move的基础数据类型,并且通过基础数据类型定义变量和常量。这里划重点,Move跟其他语言的不同,以及很多Move编程需要注意的细节。

下期我们将会介绍Move的函数定义。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论