Solidity的Usingfor的使⽤
前⾔
其实呢,今天刚接触Using for的时候,我并没有看懂它的意思。官⽅的⽂档有些晦涩难懂,导致我也产⽣了它与import的区别这样的疑问。
register for使⽤
与import的联系与区别
先回答第⼆个问题,using A for B与import有什么区别?
import是讲某个合约contract或者某个库lib导⼊到当前⽂件,它是using的前提;import后,当前⽂件内可以引⽤被引⼊⽂件内定义的library或contract。
举个栗⼦:
这⾥,如果没有先import,直接using,会报错。除⾮别的被import的⽂件再import了它。换句换说,就是using的前提是需要直接或者间接的导⼊某个library.
Using for 如何使⽤
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类型的变量,表⽰调⽤者。
using A for B,A的函数的第⼀个参数必须和B的数据类型⼀致。
还有这个⽅法是可以重载的,你可以定义好⼏个同名的⽅法,但是第⼀个参数的类型不同,调⽤的时候⾃动的根据调⽤类型选择某⼀种⽅法。
实例
struct Data { mapping(uint => bool) flags; }
function insert(Data storage self, uint value)
public
returns(bool)
{
if (self.flags[value])
return false; // already there
self.flags[value] = true;
return true;
}
function remove(Data storage self, uint value) public
returns(bool)
{
if (!self.flags[value])
return false; // not there
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 Set.Data;
Set.Data knownValues;
function register(uint value)public {
// 相当于Set.insert(knownValues, value)
require(knownValues.insert(value));
}
}
function indexOf(uint[] storage self, uint value)
public
view
returns(uint)
{
for (uint i = 0; i < self.length; i++)
if (self[i] == value) return i;
return uint(-1);
}
}
contract C {
using Search for uint[];
uint[] data;
function append(uint value)public {
data.push(value);
}
function replace(uint _old, uint _new)public {        uint index = data.indexOf(_old);
if (index == uint(-1))
data.push(_new);
else
data[index] = _new;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。