Skip to main content

Using For

  • using A for B;: 将库A附加到类型B上,让 B 拥有 A 的方法。A 中函数将调用他们的对象作为第一个参数
  • using A for *: 是将库A附加到任意类型上

指令仅在当前合约中有效

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.3;

struct Data { mapping(uint => bool) flags; }

library Set {

function insert(Data storage self, uint value)
public
returns (bool)
{
if (self.flags[value])
return false; // 已经存在
self.flags[value] = true;
return true;
}

function remove(Data storage self, uint value)
public
returns (bool)
{
if (!self.flags[value])
return false; // 不存在
self.flags[value] = false;
return true;
}

function contains(Data storage self, uint value)
public
view
returns (bool)
{
return self.flags[value];
}
}

contract C {
using Set for Data; // 这里是关键的修改
Data knownValues;

function register(uint value) public {
// 这里, Data 类型的所有变量都有与之相对应的成员函数。
// 下面的函数调用和 `Set.insert(knownValues, value)` 的效果完全相同。
require(knownValues.insert(value));
}
}