Solidity编程语言:结构体struct
使用结构体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;
}
}
- Solidity中的结构只在当前合约或者子类合约中可用,外部是不可见的,而且使用结构体的函数需要修饰为internal。
- 非要这么做的话,则可以通过函数调用进行传递基本类型的数据,然后再次组装成同样的结构体 数组参数 这里有碰到个问题就是在函数参数不能是不固定的复杂类型参数,下边代码中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“蓝莲花”知名。