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;
}
}

编译执行以上结果,我们发现结构体作为函数参数有两点特性,


  1. 函数必须用internal修饰
  2. 结构体的形参不能直接赋值给​​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详解

能坚持跟我一起学到这里,真的狠不戳哦,加油,该课程内容完结的彼岸就在眼前。


通学技术 学通技术