|
大家好,通学技术,学通技术,让我们一起继续来看看智能合约结构体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的语法就介绍基本介绍完了,留下最后的枚举我们下节说,另外 我们在好好回顾总结下。这里的结束其实仅仅使我们真正要买入区块链技术的开始。让我们一起打起精神来,进行 更有意思的学习吧~
|