Solidity
在solidity中,如何復製字元串或按值傳遞?
在這個例子中,我只修改了字元串 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?")