solidity: returns(string[] memory) 不允许 return of string[5]?
solidity: returns(string[] memory) won't permit return of string[5]?
我想知道为什么如果我的函数是 return 一个不确定长度的字符串,我不能 return 一个确定长度的字符串数组。
这个函数,例如不编译
function BindingTypeList() public pure returns(string[] memory) {
return ["DocumentTemplate", "Definition", "RepAndWarranty", "Restriction", "Entitlement"];
}
错误信息是TypeError: Return argument type string memory[5] memory is not implicitly convertible to expected type (type of first return variable) string memory[] memory.
他们好像在说 string[5]
与 returns(string[])
不兼容。我完全不明白。有解决方法吗?
你试图return一个动态数组(string[]
),但实际上return
语句实例化了一个固定数组(string[5]
)。
快速修复:Return string[5] memory
(而不是 string[] memory
)。
Solidity 目前 (v0.8) 无法调整内存数组的大小。所以你不能只在内存中定义一个空的动态数组,然后将 push()
放入其中。但是有一个变通方法 return 包含预定义项目列表的动态数组:
您可以定义一个包含 5 个空项的动态数组,然后重新分配它们的值。
function BindingTypeList() public pure returns(string[] memory) {
string[] memory arr = new string[](5); // 5 empty items
arr[0] = "DocumentTemplate";
arr[1] = "Definition";
arr[2] = "RepAndWarranty";
arr[3] = "Restriction";
arr[4] = "Entitlement";
return arr;
}
我想知道为什么如果我的函数是 return 一个不确定长度的字符串,我不能 return 一个确定长度的字符串数组。
这个函数,例如不编译
function BindingTypeList() public pure returns(string[] memory) {
return ["DocumentTemplate", "Definition", "RepAndWarranty", "Restriction", "Entitlement"];
}
错误信息是TypeError: Return argument type string memory[5] memory is not implicitly convertible to expected type (type of first return variable) string memory[] memory.
他们好像在说 string[5]
与 returns(string[])
不兼容。我完全不明白。有解决方法吗?
你试图return一个动态数组(string[]
),但实际上return
语句实例化了一个固定数组(string[5]
)。
快速修复:Return string[5] memory
(而不是 string[] memory
)。
Solidity 目前 (v0.8) 无法调整内存数组的大小。所以你不能只在内存中定义一个空的动态数组,然后将 push()
放入其中。但是有一个变通方法 return 包含预定义项目列表的动态数组:
您可以定义一个包含 5 个空项的动态数组,然后重新分配它们的值。
function BindingTypeList() public pure returns(string[] memory) {
string[] memory arr = new string[](5); // 5 empty items
arr[0] = "DocumentTemplate";
arr[1] = "Definition";
arr[2] = "RepAndWarranty";
arr[3] = "Restriction";
arr[4] = "Entitlement";
return arr;
}