使用结构体struct可以自定义数据类型,结构体内可以包含除自身以外的所有数据类型,如果包含自身则会形成递归。
定义与初始化
pragma solidity >=0.4.0 <0.6.0;Solidity中的结构只在当前合约或者子类合约中可用,外部是不可见的,而且使用结构体的函数需要修饰为internal。 非要这么做的话,则可以通过函数调用进行传递基本类型的数据,地被苗圃然后再次组装成同样的结构体 数组参数 这里有碰到个问题就是在函数参数不能是不固定的复杂类型参数,下边代码中seal1就无法编译通过。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;
} }
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芯链创始人,BTC专栏作家。十余年金融大数据、区块链技术开发经验,曾参与创建银联大数据。主创区块链教学视频节目《明说》30多期,编写了《以太坊官网文档中文版》,并作为主要作者编写了《区块链开发指南》,在中国区块链社区以ID“蓝莲花”知名。