Solidity

在solidity中,如何復製字元串或按值傳遞?

  • December 22, 2020

在這個例子中,我只修改了字元串 a,但是 a 和 b 都被改變了。似乎沒有復製字元串。我只想換一個。如何復製字元串以及如何將字元串按值傳遞給另一個函式?

function test() public view returns (string memory, string memory)
{
   string memory a = "Hello?";
   string memory b = a;
   bytes(a)[5] = '!'; // modify string a
   return (a, b);
}

solidity 中的字元串和數組永遠不會按值傳遞。該類型string memory意味著該變數包含一個記憶體指針,因此當您分配時,a = b您只是將指針複製到字元串,而不是字元串本身。因此,只有一個字元串。

如果您想要副本,則必須手動製作副本。

這個函式可以複製一個,但是你可以很容易地在和bytes memory之間來迴轉換。string memory``bytes memory

function copyBytes(bytes memory _bytes) private pure returns (bytes memory)
{
   bytes memory copy = new bytes(_bytes.length);
   uint256 max = _bytes.length + 31;
   for (uint256 i=32; i<=max; i+=32)
   {
       assembly { mstore(add(copy, i), mload(add(_bytes, i))) }
   }
   return copy;
}

在您的函式中使用copyBytes如下所示:

function test() public view returns (string memory, string memory)
{
   string memory a = "Hello?";
   string memory b = string(copyBytes(bytes(a)));
   bytes(a)[5] = '!'; // modify string a
   return (a, b);
}

這將返回("Hello!", "Hello?")

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