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

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

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

通学技术 学通技术

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值