Solidity的结构体与映射

结构体(Structs)

Solidity提供结构体来自定义类型,自定义的类型是引用类型。
我们通过实例来理解它。

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);
    }
}

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

映射(Mappings)

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

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表示合约发起者的地址。

猜你喜欢

转载自blog.csdn.net/qq_33764491/article/details/80403603