通学智能合约系列(二十一)--结构体<下>
Posted 通学技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通学智能合约系列(二十一)--结构体<下>相关的知识,希望对你有一定的参考价值。
大家好,通学技术,学通技术,让我们一起继续来看看智能合约结构体memory
和storage
类型转换吧~
6、结构体storage转storage详解
hello,大家好,我们紧接着上节内容来看看,结构体关于storage
和memory
类型的转换。
我们先来看一个例子:
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
函数的执行结果是什么呢?以上的代码执行逻辑可以简要概括如下:
- 我们初始化了一个
Student
类型的tmp
结构体 - 然后我们调用
getStudent
函数,将tmp
拷贝了一份副本赋值给了stu
, - 然后我们再将
stu
赋值给了student
, - 最后,我们输出
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
结构体的赋值的顺序做了调整。那么他的答案又是什么呢?
我们依然是来分析一下他的执行逻辑:
- 我们初始化了一个
Student
类型的tmp
结构体 - 然后我们调用
getStudent
函数,将tmp
拷贝了一份副本赋值给了stu
, - 我们对
stu
对象重新赋值了tong xue ji shu
. - 然后我们再将
stu
赋值给了student
, - 最后,我们输出
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;
我们依然是来分析一下他的执行逻辑:
-
我们初始化了一个
Student
类型的student
结构体 -
然后我们调用
getStudent
函数,将student
引用指向了stu
, -
然后我们将
stu
又赋值给了内存中的student
-
接着我们对
student
对象重新赋值了tong xue ji shu
. -
最后,我们输出
student.name
,结果显示了xiao wang
;这个说明,我们的内存中的修改,依然是不会影响区块链上的内容的。
9、结构体memory转memory详解
hello,大家好,我们最后来看看 memory
转memory
。
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
的语法就介绍基本介绍完了,留下最后的枚举我们下节说,另外 我们在好好回顾总结下。这里的结束其实仅仅使我们真正要买入区块链技术的开始。让我们一起打起精神来,进行 更有意思的学习吧~
以上是关于通学智能合约系列(二十一)--结构体<下>的主要内容,如果未能解决你的问题,请参考以下文章