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));
}
}