Solidity

如何複製一個堅固的結構?

  • March 27, 2018

我希望能夠觸發 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,而是原始的foostayFalse(不是說它會幫助任何人)。

真正的問題是,你在整個過程中只有一個 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);
   }
}

引用自:https://ethereum.stackexchange.com/questions/43929