Solidity 中的字符串数组
String array in solidity
我遇到了一个很常见的问题,似乎我无法在 solidity 中优雅高效地解决。
我必须将任意长字符串的任意长数组传递给 solidity 合约。
在我看来应该是这样的
function setStrings(string [] row)
但好像做不到
我该如何解决这个问题?
这是 Solidity 的一个限制,原因是 string
基本上是一个任意长度的字节数组(即 byte[]
),所以 string[]
是一个双-维字节数组(即 byte[][]
)。根据Solidity references,暂不支持二维数组作为参数
Can a contract function accept a two-dimensional array?
This is not yet implemented for external calls and dynamic arrays - you can only use one level of dynamic arrays.
解决此问题的一种方法是,如果您预先知道所有字符串的最大长度(在大多数情况下是可能的),那么您可以这样做:
function setStrings(byte[MAX_LENGTH][] row) {...}
Solidity 尚不支持字符串数组作为参数。
您可以将数组元素转换为字节字符串,然后将该字节字符串反序列化回函数内的数组。虽然这可能会证明非常昂贵,但如果您别无选择,您可以尝试一下。您可以按照 this 短文 serialize/deserialize solidity 中的任何数据类型。
字符串数组在 Solidity 中不可用
因为 String 基本上是字符数组
未实现嵌套动态数组
solidity中有两种类型的数组:静态数组和动态数组。
数组声明
静态数组:这些具有固定大小。
int[5] list_of_students;
list_of_students = ["Faisal","Asad","Naeem"];
我们使用索引号
访问值
动态数组:这些数组的大小动态增加或减少。
int[] list_of_students;
list_of_students.push("Faisal");
list_of_students.push("Asad");
list_of_students.push("Smith");
我们可以使用索引号访问该值。
push
和 pop
函数用于插入和删除值。 length函数用于测量数组的长度。
可以使用
pragma experimental ABIEncoderV2;
在合同的顶部,您可以使用动态字符串数组。前任。
string[] memory myStrings;
2021 年 12 月更新
自 Solidity 0.8.0 起,默认使用 ABIEncoderV2
,它为动态字符串数组提供本机支持。
pragma solidity ^0.8.0;
contract Test {
string[] public row;
function getRow() public view returns (string[] memory) {
return row;
}
function pushToRow(string memory newValue) public {
row.push(newValue);
}
}
您需要的所有解决方案:-
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;
contract HelloWorld {
string[] strings;
// push one string to array
function pushToStrings(string memory _data) public{
strings.push(_data);
}
//get all the strings in array form
function GetAllStrings() view public returns(string[] memory){
return strings;
}
//get nth string of strings array
function GetNthStrings(uint x) view public returns(string memory){
return strings[x];
}
//push array of strings in strings
function pushStringsArray(string[] memory someData) public{
for (uint i=0; i < someData.length; i++) {
strings.push(someData[i]);
}
}
//change whole strings, take array of strings as input
function changeWholeString(string[] memory someData) public{
strings=someData;
}
}
这是管理数组 push
、get
、getAll
的示例合约
和 remove
pragma solidity ^0.8.4;
contract Array {
string[] private fruits = ["banana", "apple", "avocado", "pineapple", "grapes"];
function push(string memory item) public {
fruits.push(item);
}
function get(uint256 index) public view returns (string memory) {
return fruits[index];
}
function remove(uint256 index) public returns (bool) {
if (index >= 0 && index < fruits.length) {
fruits[index] = fruits[fruits.length - 1];
fruits.pop();
return true;
}
revert("index out of bounds");
}
function getAll() public view returns (string[] memory) {
return fruits;
}
}
我遇到了一个很常见的问题,似乎我无法在 solidity 中优雅高效地解决。
我必须将任意长字符串的任意长数组传递给 solidity 合约。
在我看来应该是这样的
function setStrings(string [] row)
但好像做不到
我该如何解决这个问题?
这是 Solidity 的一个限制,原因是 string
基本上是一个任意长度的字节数组(即 byte[]
),所以 string[]
是一个双-维字节数组(即 byte[][]
)。根据Solidity references,暂不支持二维数组作为参数
Can a contract function accept a two-dimensional array?
This is not yet implemented for external calls and dynamic arrays - you can only use one level of dynamic arrays.
解决此问题的一种方法是,如果您预先知道所有字符串的最大长度(在大多数情况下是可能的),那么您可以这样做:
function setStrings(byte[MAX_LENGTH][] row) {...}
Solidity 尚不支持字符串数组作为参数。
您可以将数组元素转换为字节字符串,然后将该字节字符串反序列化回函数内的数组。虽然这可能会证明非常昂贵,但如果您别无选择,您可以尝试一下。您可以按照 this 短文 serialize/deserialize solidity 中的任何数据类型。
字符串数组在 Solidity 中不可用 因为 String 基本上是字符数组 未实现嵌套动态数组
solidity中有两种类型的数组:静态数组和动态数组。
数组声明
静态数组:这些具有固定大小。
int[5] list_of_students;
list_of_students = ["Faisal","Asad","Naeem"];
我们使用索引号
访问值动态数组:这些数组的大小动态增加或减少。
int[] list_of_students;
list_of_students.push("Faisal");
list_of_students.push("Asad");
list_of_students.push("Smith");
我们可以使用索引号访问该值。
push
和 pop
函数用于插入和删除值。 length函数用于测量数组的长度。
可以使用
pragma experimental ABIEncoderV2;
在合同的顶部,您可以使用动态字符串数组。前任。
string[] memory myStrings;
2021 年 12 月更新
自 Solidity 0.8.0 起,默认使用 ABIEncoderV2
,它为动态字符串数组提供本机支持。
pragma solidity ^0.8.0;
contract Test {
string[] public row;
function getRow() public view returns (string[] memory) {
return row;
}
function pushToRow(string memory newValue) public {
row.push(newValue);
}
}
您需要的所有解决方案:-
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;
contract HelloWorld {
string[] strings;
// push one string to array
function pushToStrings(string memory _data) public{
strings.push(_data);
}
//get all the strings in array form
function GetAllStrings() view public returns(string[] memory){
return strings;
}
//get nth string of strings array
function GetNthStrings(uint x) view public returns(string memory){
return strings[x];
}
//push array of strings in strings
function pushStringsArray(string[] memory someData) public{
for (uint i=0; i < someData.length; i++) {
strings.push(someData[i]);
}
}
//change whole strings, take array of strings as input
function changeWholeString(string[] memory someData) public{
strings=someData;
}
}
这是管理数组 push
、get
、getAll
的示例合约
和 remove
pragma solidity ^0.8.4;
contract Array {
string[] private fruits = ["banana", "apple", "avocado", "pineapple", "grapes"];
function push(string memory item) public {
fruits.push(item);
}
function get(uint256 index) public view returns (string memory) {
return fruits[index];
}
function remove(uint256 index) public returns (bool) {
if (index >= 0 && index < fruits.length) {
fruits[index] = fruits[fruits.length - 1];
fruits.pop();
return true;
}
revert("index out of bounds");
}
function getAll() public view returns (string[] memory) {
return fruits;
}
}