通学智能合约系列(十九)--结构体<上>

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

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

  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详解

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

通学技术 学通技术

以上是关于通学智能合约系列(十九)--结构体<上>的主要内容,如果未能解决你的问题,请参考以下文章

通学智能合约系列(二十)--结构体<上>

通学智能合约系列(二十)--结构体<上>

通学智能合约系列(二十)--结构体<下>

通学智能合约系列(二十一)--结构体<下>

通学智能合约系列(二十一)--结构体<下>

通学智能合约系列(十九)--memory与storage