Solidity中的两种类型传递:
- 值类型传递memory;
- 引用类型传递storage;
如果一个变量是值类型,那么当把它的值传给另一个变量时,是复制值,对新变量的操作不会影响原来的变量;如果该变量是引用类型,那么当它传值给另一个变量时,则是把该值的地址复制给新的变量。这样操作新变量也会导致旧变量的改变。
值类型:
布尔类型(bool)、整型(int)、地址类型(address)、定长字节数组(bytes)、枚举类型(enums)、函数类型(function);
如果一个变量是值类型,给它赋值时永远是值传递!
引用类型:
字符串(string)、数组(array)、结构体(structs)、字典(mapping)、不定长字节数组(bytes)
如果一个变量是引用类型,给它赋值时可以是值,也可以是引用,这决定于该变量是Storage类型还是Memory类型。
示例代码如下:
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.7;
contract storage_demo{
User adminuser;
struct User{
string name;
uint8 age;
string sex;
}
function setUser(string memory _name,uint8 _age,string memory _sex)public{
adminuser.name=_name;
adminuser.age=_age;
adminuser.sex=_sex;
}
function getUser()public view returns(User memory){
return adminuser;
}
function setAge1(uint8 _age)public{
User memory user=adminuser;
user.age = _age;
}
function setAge2(uint8 _age)public{
User storage user=adminuser;
user.age = _age;
}
}
使用memory时,getUser的结果并未发生改变,说明memory并未改变原数据;而使用storage时数据发生了改变,说明其原数据已经出现变更。当然也可以通过下述方法进行修改:
function setAge(User storage _user,uint8 _age)internal{
_user.age=_age;
}