Solidity编程语言:结构体struct

Solidity编程语言:结构体struct

汪晓明 发布在 技术指南 链圈子 97933

使用结构体struct可以自定义数据类型,结构体内可以包含除自身以外的所有数据类型,如果包含自身则会形成递归。

定义与初始化

pragma solidity >=0.4.0 <0.6.0;

contract EgStruct { mapping (string => Book) bookList; struct Book{ string name; uint pages; string[] contents; }

struct Reader{ mapping (string => Book) books; string name; }

Reader r; function init() public{ string[] memory b1c = new string[](3); b1c[0] = "1.0.1"; b1c[1] = "1.0.2"; b1c[2] = "2.0.1"; Book memory b1 = Book("book1",10,b1c);

Book memory b2 = Book({ name:"book2", pages:20, contents:b1c });

Reader memory r1 = Reader("jack");

Reader memory r2 = Reader({ name:"rosh" });

// Reader memory r2 = Reader(bookList,"jack"); // Reader memory r3 = Reader({ // books:bookList, // name:"rosh" // });

r = r2; r.books["book1"] = b1; //r2.bookList["book2"] = b2;

//r2.books = bookList; //r.books = bookList;

} }

  1. Solidity中的结构只在当前合约或者子类合约中可用,外部是不可见的,而且使用结构体的函数需要修饰为internal。
  2. 非要这么做的话,则可以通过函数调用进行传递基本类型的数据,然后再次组装成同样的结构体 数组参数 这里有碰到个问题就是在函数参数不能是不固定的复杂类型参数,下边代码中seal1就无法编译通过。
pragma solidity >=0.4.0 <0.6.0;

contract EgStruct { struct Book{ string name; uint pages; }

function read(Book memory b) internal{}

function callTmp(EgStructTmp tmp) public{ Book memory b = Book("jingpinmei",10); tmp.seal(b.name,b.pages); }

}

contract EgStructSub is EgStruct{ function write(Book memory b) internal{} }

contract EgStructOut { /*function seal(Book memory b) {}*/ }

contract EgStructTmp{ struct Book{ string name; uint pages; } function seal(string memory name, uint pages) public { Book memory b = Book(name, pages); } }

 

作者:感谢HPB 蓝莲花团队整理供稿。

汪晓明博客:http://wangxiaoming.com/

汪晓明:HPB芯链创始人,巴比特专栏作家。十余年金融大数据、区块链技术开发经验,曾参与创建银联大数据。主创区块链教学视频节目《明说》30多期,编写了《以太坊官网文档中文版》,并作为主要作者编写了《区块链开发指南》,在中国区块链社区以ID“蓝莲花”知名。

文章标签: Solidity
评论
登录 账号发表你的看法,还没有账号?立即免费 注册