Solidity
如何複製一個堅固的結構?
我希望能夠觸發 runTest() 並返回 false。我需要在某個時候複製該結構,但我不確定如何可靠地完成它。我認為將它作為記憶體傳遞給另一個函式將是一個複製,但原來的被修改了。
pragma solidity ^0.4.19; pragma experimental ABIEncoderV2; contract Tester { struct Foo { bool stayFalse; } function Tester() public { } function runTest() public constant returns (bool) { Foo memory foo; return one(foo); } function one(Foo memory foo) public constant returns (bool){ Foo memory foobar; foobar = two(foo); return foo.stayFalse; } function two(Foo memory bar) public constant returns(Foo) { bar.stayFalse = true; return bar; } }
我不認為這意味著你認為它意味著什麼。
問題是您正在創建一個新
Foo
的執行測試,然後將其傳遞給one()
,然後將其傳遞給 ,然後將其two()
更改為two()
返回,然後將其one()
分配給foobar
,然後繼續返回甚至不是foobar
‘s,而是原始的foo
的stayFalse
(不是說它會幫助任何人)。真正的問題是,你在整個過程中只有一個 Foo,所以無論你做什麼,你都會改變它。您需要創建一個全新的副本。
為了複製一個結構,您需要使用從舊結構複製的欄位創建一個新結構。
例子:
下面的範例包含一個
clone()
函式,該函式創建一個新函式,其中包含Foo
來自源的參數Foo
。pragma solidity ^0.4.19; pragma experimental ABIEncoderV2; contract Tester { struct Foo { bool stayFalse; } function Tester() public { } function runTest() public pure returns (bool, bool) { Foo memory foo; return one(foo); } function one(Foo memory foo) public pure returns (bool, bool){ Foo memory foobar = two(clone(foo)); return (foo.stayFalse, foobar.stayFalse); } function two(Foo memory bar) public pure returns (Foo) { bar.stayFalse = true; return bar; } function clone(Foo memory from) internal pure returns (Foo memory) { return Foo(from.stayFalse); } }