通学智能合约系列(二十)--结构体<上>
Posted 通学技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通学智能合约系列(二十)--结构体<上>相关的知识,希望对你有一定的参考价值。
hello,大家好,欢迎继续坚持学习智能合约。这们这节来看看solidity
结构体.
3、结构体定义与初始化
在solidity的世界中,同样定义了结构体来表示复杂的对象类型,我们一起看看他是怎么来定义和初始化的吧~
pragma solidity ^0.4.16;
contract StructTest
// 定义一个结构体
struct Student
string name;
uint grade;
function init() view returns(string,uint)
// 初始化方式一
Student memory s = Student("tong",100);
return(s.name,s.grade);
function init2() view returns(string,uint)
// 初始化方式二
Student memory s = Student(name:"tong",grade:100);
return(s.name,s.grade);
那么在结构体内部是否支持套娃模式呢?
struct Student
string name;
uint grade;
// 显然 sao叔是不支持我们这么玩的 不过他也为我们开了一扇另外的窗户
// Student student;
struct Student2
string name;
uint grade;
// so 这就是他给予我们的支持,我们可以使用数组 或者mapping的方式来自己套自己
Student2[] student;
mapping(uint=>Student2) tongtong;
关于结构体的基础内容就介绍到这里,我们下节见。
4、 结构体中的mapping特性
在上小节中,我们已经看到了结构体中mapping
的独特之处,就是支持套娃,那么他是否还有其他独特之处值得一秀呢?答案是显然的,要不然我们也不会给他再单独开一段特写,让我们一起来看看吧。
pragma solidity ^0.4.16;
contract StructTest
struct Student
string name;
uint grade;
mapping(uint=>Student) tongMap;
function init() view returns(string,uint)
// 1、结构体中存在mapping时,初始化结构体可以忽视mapping
Student memory s = Student("tong",100);
// 2、memory类型结构体对象是不能直接操作mapping属性变量的
// s.tongMap[0] = "I love blockChain";
return(s.name,s.grade);
上帝给你关上一扇门的时候,必然会 为你开启一扇窗。
既然memory
不能操作我们结构体中的mapping类型属性,那么他的兄弟`storage总可以把?
pragma solidity ^0.4.16;
contract StructTest
struct Student
string name;
uint grade;
mapping(uint=>string) tongMap;
Student tongtong;
function init() view returns(string,uint,string)
Student memory s = Student("tong",100);
// s.tongMap[0] = "I love blockChain";
tongtong = s;
tongtong.tongMap[0] = "I really love blockChain";
return(s.name,s.grade,tongtong.tongMap[0]);
果然,编译执行上述结果后,输出了我们想要的内容。果然,命运是会眷顾用心的人的。
5、结构体作为函数参数
同志们,既然我们知道了结构体作为一种可以直接描述对象的数据结构,那么他作为函数的参数在solidity
的世界里,会是什么样呢?我们来看个例子吧
pragma solidity ^0.4.16;
contract StructTest
struct Student
string name;
uint grade;
// 结构体作为函数参数时 函数必须用internal修饰
function test(Student student) internal
//Student stu = Student;
编译执行以上结果,我们发现结构体作为函数参数有两点特性,
- 函数必须用internal修饰
- 结构体的形参不能直接赋值给
storage
类型的结构体
关于以上第二点会报出一下错误:
browser/Math.sol:13:9: TypeError: Type type(struct StructTest.Student storage pointer) is not implicitly convertible to expected type struct StructTest.Student storage pointer.
Student stu = Student;
^-------------------^
既然不能按照以上方式赋值,那么我们如何进行赋值呢?这个问题我们留到下节课介绍,将分别介绍
- 结构体storage转storage详解
- 结构体memory转storage详解
- 结构体storage转memory详解
- 结构体memory转memory详解
能坚持跟我一起学到这里,真的狠不戳哦,加油,该课程内容完结的彼岸就在眼前。
通学技术 学通技术
以上是关于通学智能合约系列(二十)--结构体<上>的主要内容,如果未能解决你的问题,请参考以下文章