结构体(Structs)

Solidity提供结构体来自定义类型,自定义的类型是引用类型。
结构体内可以包含整型、字符串、数组、结构体、映射等数据类型。
如果你尝试对memory的映射类型赋值,会报错
Error: Member "map" is not available in struct StructMappingInitial.A memory outside of storage.
另外,结构体的可见性,目前只支持internal.只能在当前合约或者子合约中使用,而且引用结构体为参数的函数必须显性的声明为internal。
我们通过实例来理解它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
pragma solidity ^0.4.0;

contract Test {
// 定义一个结构体
struct Number {
string name;
uint age;
}

// 结构体还可以包含数组,映射等类型
struct Family {
uint id;
Number[] numbers;
mapping(string=>Number) index;
}

// 初始化一个结构体
// 方法1,直接填写参数,但是参数的顺序要保持一致
Number number1 = Number("妈妈", 28);
Number number2 = Number("爸爸", 30);
// 方法2,指定参数
Number number3 = Number({age:4,name:"儿子"});

// 结构体的可见性,目前只支持internal.只能在当前合约或者子合约中使用,
// 而且引用结构体为参数的函数必须显性的声明为internal。
function a(Number number) internal{
//....
}

function b() {
a(number1);
}

}

contract Test2 is Test{
function c() {
Number memory number1 = Number("妈妈", 28);
a(number1);
}
}

映射(Mappings)

映射,类似于Python预言中的字典,是建立成键值对的方式。格式如下:
mapping(键类型=>值类型) 映射名;
例如:
mapping(address=>uint)) public balance
它一般用于通过账户地址来查询对应的余额。
其中,键的类型允许出映射以外所有的类型。
可以通过将映射标记为public,来让Solidity创建一个访问器。
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pragma solidity ^0.4.0;

contract MappingExample {
mapping(address => uint) public balances;

function update(uint newBalance) public {
balances[msg.sender] = newBalance;
}
}

contract MappingUser {
function f() public returns (uint) {
MappingExample m = new MappingExample();
m.update(100);
return m.balances(this);
}
}

这里写图片描述
MappingExample合约中,先执行update的方法,更新合约发起者的账户余额。
通过balances访问器,输入账户地址,可以对应的查询到账户的余额。
MappingUser合约中,先创建一个MappingExample的实例,调用update的方法,重新设定合约发起者的账户信息。
最后通过balanaces访问器映射返回余额。this表示合约发起者的地址。