using A for B,这里A通常是某个library里面定义的某个方法,B是某种数据类型,这句话是把A方法绑定到B类型上,相当于给B类型附加了一个A方法。(也有翻译为附着库的) 在上面的例子中,将LibContract里定义的方法绑定到所有的数据类型。但是一般我们不会在所有的类型实例上都去调用LibContract的方法,应该是要按需using的,这里偷懒就写*。 在通俗一点的例子就是, 比如 using LibInt for uint,然后LibInt里面有定义一个toString方法。我们有一个uint a;那么可以这样调用a.toString(),toString方法在定义的时候,第一个参数会是一个uint类型的变量,表示调用者。
library Set { struct Data { mapping(uint => bool) flags; }
functioninsert(Data storage self, uint value) public returns (bool) { if (self.flags[value]) returnfalse; // already there self.flags[value] = true; returntrue; }
functionremove(Data storage self, uint value) public returns (bool) { if (!self.flags[value]) returnfalse; // not there self.flags[value] = false; returntrue; }