128

关于智能合约中,嵌套结构体的使用,求教各位大神

today · 于 发布 · 最后由 jason_chen回复 · 664 次阅读

最近尝试定义合约,但是发现有些关于嵌套结构体问题不太能搞定。先贴代码。
合约代码

contract Student
{
    struct School
    {
        string schoolname;
        string location;
        string level;
        mapping(string=>Sudent) students;//stuno=>student
    }

    struct Sudent
    {
        string studentname;
        uint256 age;
        int gender;
    }
    mapping(address=>School) public s;

    function InitSchoolInfo(string _shoolname, string _location, string _level)
    {
        s[msg.sender].schoolname;=_shoolname;
        s[msg.sender].location=_location;
        s[msg.sender].level=_level;
    }

    function GotoSchool(string _stuno, string _studentname,uint256 _age,int _gender)
    {
        s[msg.sender].students[_stuno].studentname = _studentname;
        s[msg.sender].students[_stuno].age = _age;
        s[msg.sender].students[_stuno].gender = _gender;
    }

}

部分js代码

js代码
//假定  用户地址为address = '0x06400992be45bc64a52b5c55d3df84596d6cb4a1';

//执行初始化
var res = contracts['Student'].contract.InitSchoolInfo('NO14 Middle school','beijing','1',{from:address});

//执行gotoschool

var res = contracts['Student'].contract.GotoSchool('10010','单志刚',30,1,{from:address});


//读取 结构体信息
var res = contracts['Student'].contract.s(address);
alert(res);//NO14 Middle school,beijing,1

疑问是,为什么 alert(res) 的结果是 NO14 Middle school,beijing,1 呢?
我该如何查询出res 中 students['10010']的结构体信息呢?
求助。。。

  • 51 large
    rubyu2

    mapping 是没有办法直接获取到里面所有 key-value 内容的,只能根据 key 来映射。
    所以 struct 里的 mapping 类型的属性也只能通过方法来读取,你需要写一个类似的get方法,通过学校和学生的_stuno两个参数来得到学生的结构体。
    或者你可以用数组试下。

  • 128
    jason_chen

    你好!我刚接触到结构体嵌套,请问你的问题解决了吗?

  • 128
    today

    @jason_chen 算是解决了吧。只不过,结果比不是自己理想的那种。没办法通过contracts['Student'].contract.s(address)获取到结构体里嵌套的内容,只能单独做一个function,来回去。
    function getstudent(address school, string stuno) returns(string,uint256,int)
    {
    return
    (
    s[school].students[stuno].studentname,
    s[school].students[stuno].age ,
    s[school].students[stuno].gender
    );
    }
    大概是这样,希望对你有帮助。

  • 128
    jason_chen

    @today 好的,谢谢啊!有问题再请教