Library
庫,在類型中依賴於參數的查找後未找到或不可見
我正在嘗試理解庫,並且一直執行到“在類型中依賴於參數的查找後未找到或不可見”。
pragma solidity ^0.4.17; library L{ struct S{ uint UI; } function GetLF(S storage R)external returns(uint LOutP) { return R.UI; } function SetLF(S storage R,uint LInP)external { R.UI=LInP; } } contract C{ using L for L.S; L.S LS; function setCF(uint CInP)external { L.SetLF(LS,CInP); //<-------error } function GetCF() external returns(uint COutP){ return L.GetLF(LS); //<-------error } }
嘗試在合約中使用庫函式時總是會發生這種情況。
我認為這可能是混音的問題,因為我在這段程式碼中遇到了它。 http://solidity.readthedocs.io/en/develop/contracts.html#libraries
pragma solidity ^0.4.11; library Set { struct Data { mapping(uint => bool) flags; } function insert (Data storage self, uint value)external returns (bool) { if (self.flags[value]) return false; self.flags[value] = true; return true; } function remove(Data storage self, uint value)external returns (bool) { if (!self.flags[value]) return false; self.flags[value] = false; return true; } function contains(Data storage self, uint value)external returns (bool) { return self.flags[value]; } } contract C { Set.Data knownValues; function register(uint value)external { require(Set.insert(knownValues, value));//<-----error } }
所以我希望了解此錯誤的原因並更好地了解庫關鍵字。
我懷疑是因為它們降低了一次性部署成本,但增加了多次天然氣運營成本。它們主要用於工廠模式類型的東西,部署成為很多時間成本。
您首先必須將庫函式更改為不是
external
因為庫呼叫是使用它們的合約內部的。將它們標記為public or
內部`。庫函式呼叫還有一種更直覺的(至少對我而言)語法,所以而不是
L.SetLF(LS,CInP);
你可以做
LS.SetLF(CInP);