3

区块链特辑——solidity语言基础(三) - wybsignal

 1 year ago
source link: https://www.cnblogs.com/wybsignal/p/17041620.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Solidity语法基础学习

五、映射类型:

Mapping Type

映射钥匙Key → 真实资料 Value

mapping(KeyType → ValueType) VariableName

·关键字:mapping

  ·宣告一个映射,后面需定义钥匙(Key)与资料(Value)的型态

·KeyType

  ·只能使用“内建型态(int,uint,……)”、“bytes”、“string”,或者“contract”与“列举enum型态”。

  ·不支持“使用者自定义”或“复杂”的型态,如“映射mapping”、“结构structs”或“阵列arry”

·ValueType

  ·可以是任何型态

  ·各种值的预设值:

    字串→预设值→空

    数字→预设值→0

    布尔值→预设值→0/false

mapping的原理

·所有的value都会被初始化成“预设值”。

  ·原因是在以太坊的空间上,所有未初始化的空间,都是0,换言之就是每个型态被迪定义的“预设置”。

·Key并不会被存在mapping型态里,因此使用者没办法从mapping中取得所有的Key

·那他是怎么查询的呢?

  ·keccak256(Key)→Value

·因此,mapping没有办法记录长度、大小、在没有key的情况下也不能列出所有的value

Example:学号与成绩

·建立一份合约class

·建立一个映射,将学号映射到成绩中:

  ·学号uint

  ·成绩uint

·提供一个函数update来更新学生成绩

  ·update(uint student_id,uint score)

·提供一个函数getScore来取得学生成绩

  ·get(uint students_id) → uint score

代码示例:

 

2982868-20230110222816663-1908385769.png

//SPDX-License-Identifier:MIT pragma solidity ^0.8.17;

contract Class { mapping(uint => uint) Students; function update(uint id,uint score) public { Students[id] = score; } function set(uint id) public view returns(uint) { return Students[id]; } }

六、循环体:

Control Structure

前言:在程序中会遇见同一件事情需要用很多次,需要重复很多次,这时不可能将代码复制很多次,就需用“控制结构”进行控制。

·关键词:if

  ·当满足“条件”的时候,则执行“{}内的代码”

·条件必须是个“布尔值”

  ·也就是逻辑判断,如:未满十八岁、是否高于最低薪资、论文有无抄袭、参考资料有无正确引用等。

若“000”,则“XXX”,否则“ZZZ”

if(条件){/*做点事儿*/} else{/*做点儿别的事儿*/}

·关键字:if-else

  ·当满足“条件”的时候,则执行“{}内的代码”

  ·若不满足“条件”则执行“else{}内的代码”

很多条件的情况

if(条件A){} else if (条件B){}……

·关键字:if-(else-if)*-else

·当有多个条件时,可以排序多个条件,else不一定要有

Example:成绩计算(if)

2982868-20230110223434529-645592173.png

//SPDX-License-Identifier:MIT pragma solidity ^0.8.17;

contract Class { //声明一个列表然后将值赋予列表 uint[] Scores = [90,91,92,93,94]; //定义一个函数X,这个函数公开可见可读可写,作用是返回一个无符号整数,输出元素计算总和,同时index自加一直到预设条件 function X() public view returns(uint) { //这里将Sum预设值归零 uint Sum = 0; //这里将index预设值归零 uint index = 0; //这里开始while循环体 while (index < 5) { //这里是Sum将Score中的每一个元素输出并相加 Sum = Sum + Scores[index]; //index自加确保在列表元素输出完后,能够跳出循环 index++; } //最终返回总和 return Sum; } }

重复做事 for

for (宣告;条件;事后修改的事) {/*做点事儿*/}

·关键字:for(  ;  ;  ){}

  ·在满足条件下,重复执行{}内的代码。

  ·循环事实上就是计数器,因此宣告是为了帮助我们制造出计数器的变数,计数器不一定是整数,只要能被利用在“条件判断中”的型态都可以使用。

  ·要遍历阵列的所有元素:for (uint index;  ;  )  {……}

·条件:同if

·事后修改的事:比如说增加计数器等修改的行为。

·若“条件”没写,则为一个“无限循环”是停不下来的。 

Example:统计学生成绩(for)

2982868-20230110223509422-356135117.png

//SPDX-License-Identifier:MIT pragma solidity ^0.8.17;

contract Class { uint[] Score = [90,91,92,93,94]; function X() public view returns(uint) { //声明一个Sum变量,将其预设值归零 uint Sum = 0; //这里for循环结构是(宣告;条件;事后修改的值){执行代码} //事实上这里宣告就是声明一个可以结束循环体的循环控制值 for ( uint index = 0;index < 5;index++ ) { Sum = Sum + Score[index]; } return Sum; } }

重复做事 while

·关键字:while( ) { }

·在特定条件下,重复执行{ }内的代码。

·条件:同if

·若“条件”没写,则为一个“无限循环”是停不下来的。

Example:统计成绩(while)

2982868-20230110223727434-565875103.png

//SPDX-License-Identifier:MIT pragma solidity ^0.8.17;

contract Class { uint[] Score = [90,91,92,93,94]; function X() public view returns(uint) { //声明一个Sum变量,将其预设值归零 uint Sum = 0; //这里for循环结构是(宣告;条件;事后修改的值){执行代码} //事实上这里宣告就是声明一个可以结束循环体的循环控制值 for ( uint index = 0;index < 5;index++ ) { Sum = Sum + Score[index]; } return Sum; } }

离开当前循环 break

break

·关键字:break

  · 跳出当前循环

·若嵌套状态,如for( ){for( ){for( ){ } } },就需要三个break。

跳出本次循环 continue

continue

·关键字:continue;

  ·跳过本次循环

    ·在“for”时,跳过以后会执行“事后修改的事”;

    ·在“while”时,就会跳回条件判断

  ·当执行到continue的时候,会无条件跳过continue后的代码。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK