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

大家好,通学技术,学通技术,让我们一起继续来看看智能合约结构体memorystorage类型转换吧~

6、结构体storage转storage详解

hello,大家好,我们紧接着上节内容来看看,结构体关于storagememory类型的转换。

我们先来看一个例子:

pragma solidity ^0.4.16;


contract StructTest{
    
    
    
    struct Student{
    
    
        string name;
        string grade;
    }
    
    Student student;
    
    function getStudent(Student storage stu) internal returns(Student){
    
    
        Student storage stu1 = stu;
        
        stu1.name = "tong xue ji shu ";
        
        stu1.grade = "social people";
        
        return stu1;
        
    }
    
    function test() view returns(string) {
    
    
         
         return getStudent(student).name;
    }
 }

编译执行后,我们得到了tong xue ji shu,我们知道了对合约中作为全局变量的结构体默认类型是storage的。我们的getStudent方法形参也是storage的,通过调用我们的test方法,将全局变量student以引用的方式传递给了我们的形式参数stu,最终修改了我们的全局变量的值。说起来还是挺简单的。

7、结构体memory转storage详解

那么如果,我们将memory赋值给storage呢?

pragma solidity ^0.4.16;


contract StructTest{
    
    
    
    struct Student{
    
    
        string name;
        string grade;
    }
    
    Student student;
    
    function getStudent(Student memory stu) internal returns(Student){
    
    
        student = stu;
        
        stu.name = "tong xue ji shu ";
        
        stu.grade = "social people";
        
        return stu;
        
    }
    
    function test() view returns(string) {
    
    
        
        Student memory tmp = Student("xiao wang","gao 2");
        
        getStudent(tmp);
         
        return student.name;
    }
 }

大家可以先思考下,上面这个test函数的执行结果是什么呢?以上的代码执行逻辑可以简要概括如下:

  1. 我们初始化了一个Student类型的tmp结构体
  2. 然后我们调用getStudent函数,将tmp拷贝了一份副本赋值给了stu
  3. 然后我们再将stu赋值给了student
  4. 最后,我们输出student.name,结果自然是展示 xiao wang;

我们在来看一个例子:

pragma solidity ^0.4.16;


contract StructTest{
    
    
    
    struct Student{
    
    
        string name;
        string grade;
    }
    
    Student student;
    
    function getStudent(Student memory stu) internal returns(Student){
    
    
        
        stu.name = "tong xue ji shu ";
        
        stu.grade = "social people";
        
        student = stu;
        
        return stu;
        
    }
    
    function test() view returns(string) {
    
    
        
        Student memory tmp = Student("xiao wang","gao 3");
        
        getStudent(tmp);
         
        return student.name;
    }
 }

这段代码仅仅是将getStudent函数中关于stu结构体的赋值的顺序做了调整。那么他的答案又是什么呢?

我们依然是来分析一下他的执行逻辑:

  1. 我们初始化了一个Student类型的tmp结构体
  2. 然后我们调用getStudent函数,将tmp拷贝了一份副本赋值给了stu
  3. 我们对stu对象重新赋值了tong xue ji shu.
  4. 然后我们再将stu赋值给了student
  5. 最后,我们输出student.name,结果自然是展示 tong xue ji shu;

代码执行的顺序,很重要,在写智能合约的时候,大家一定要注意哦。

8、结构体storage转memory详解

如果将storage传给memory又会发生什么呢?

pragma solidity ^0.4.16;


contract StructTest{
    
    
    
    struct Student{
    
    
        string name;
        string grade;
    }
    
    Student student = Student("xiao wang","gao 3");
    
    function getStudent(Student storage stu) internal returns(Student){
    
    
        
        Student memory tudent = stu;
        
        tudent.name = "tong xue ji shu ";
        
        tudent.grade = "social people";
        
        
        return tudent;
        
    }
    
    function test() view returns(string) {
    
    
    
        getStudent(student);
         
        return student.name;
    }
 }

我们依然是来分析一下他的执行逻辑:

  1. 我们初始化了一个Student类型的student结构体

  2. 然后我们调用getStudent函数,将student引用指向了stu

  3. 然后我们将stu又赋值给了内存中的student

  4. 接着我们对student对象重新赋值了tong xue ji shu.

  5. 最后,我们输出student.name,结果显示了xiao wang;

    这个说明,我们的内存中的修改,依然是不会影响区块链上的内容的。

9、结构体memory转memory详解

hello,大家好,我们最后来看看 memorymemory

pragma solidity ^0.4.16;


contract StructTest{
    
    
    
    struct Student{
    
    
        string name;
        string grade;
    }

    
    function getStudent(Student memory stu) internal returns(Student){
    
    
        
        Student memory tongtong = stu;
        
        tongtong.name = "tong xue ji shu ";
        
        tongtong.grade = "social people";
        
        
        return tongtong;
        
    }
    
    function test() view returns(string) {
    
    
        Student memory meimei = Student("meimei","3");
        
        getStudent(meimei);
         
        return meimei.name;
    }
 }

编译执行后,你会发现,答案竟然是tong xue ji shu.难道是想让你们点赞、在看、分享?

那肯定不是滴,这是因为solidity中为我们做了优化,memory实参转给memory形参是指针指向,所以最终结果

好了 ,到这一部分,我们关于智能合约 语言solidty的语法就介绍基本介绍完了,留下最后的枚举我们下节说,另外 我们在好好回顾总结下。这里的结束其实仅仅使我们真正要买入区块链技术的开始。让我们一起打起精神来,进行 更有意思的学习吧~

猜你喜欢

转载自blog.csdn.net/aiwaston/article/details/118533845
今日推荐