1、库
pragma solidity >=0.6.0<0.8.0;
// 定义库
library Search {
function indexOf(uint[] storage data, uint _value) public view returns(int){
for (uint i = 0; i< data.length; ++i) {
if (data[i] == _value) {
return int(i);
}
}
return -1;
}
}
contract TestLibrary {
uint[] data;
constructor() public {
data.push(1);
data.push(2);
data.push(3);
}
function indexOf(uint _value) public view returns(int){
// 调用库函数
return Search.indexOf(data, _value);
}
}
使用using for调用库函数
contract TestLibrary {
using Search for uint[]; // 第1步绑定
uint[] data;
constructor() public {
data.push(1);
data.push(2);
data.push(3);
}
function indexOf(uint _value) public view returns(int){
// 第2步调用
return data.indexOf(_value);
//return Search.indexOf(data, _value);
}
}
2、销毁合约
pragma solidity >=0.6.0<0.8.0;
contract TestSelfedStructContract{
address owner;
constructor() public {
owner = msg.sender;
}
modifier onlyOwner() {
require(owner == msg.sender);
_;
}
// 销毁合约,通过修改器限定只有创建者才能销毁
function kill() public onlyOwner {
// 全局函数
selfdestruct(msg.sender);
}
}
3、映射
pragma solidity >=0.6.0<0.8.0;
contract TestMapping{
// 定义
mapping(uint=>string) public uintMapping;
mapping(address=>uint) public addressMapping;
mapping(string=>mapping(uint=>address)) public stringMapping;
constructor() public {
// 赋值
uintMapping[1] = "nico";
uintMapping[2] = 'lisi';
addressMapping[0xD74B5921558C780dE418b22225fb704E06dB327A] = 100;
stringMapping['nico'][1] = 0xD74B5921558C780dE418b22225fb704E06dB327A;
}
}
4、结构体
pragma solidity >=0.6.0<0.8.0;
// 结构体没有mapping时,返回结构体变量时需要加这个
// pragma experimental ABIEncoderV2;
contract TestStruct{
struct Student{
uint id;
string name;
mapping(string=>uint) grade;
}
// 定义
Student stu;
constructor() public {
// 初始化时,只有mapping变量不需要给出,其它的都要指定
stu = Student(11, "ceshi");
// stu = Student({id: 11, name: "ceshi"}); // 还可以使用这种方式初始化
stu.grade["100"] = 100;
}
// 有mapping成员时,只能使用internal或private。
// 没有mapping成员时,没有这限制
function getStu() internal view returns(Student memory) {
return stu;
}
}
5、枚举
pragma solidity >=0.6.0<0.8.0;
contract TestEnum{
// 第1个为0,第2个为1
enum Sex{Man, Woman}
function getEnum1() public pure returns(Sex) {
return Sex.Man;
}
function getEnum2() public pure returns(uint) {
return uint(Sex.Woman);
}
}