#ethereum #solidity
Вопрос:
Мне интересно, почему, если моя функция предназначена для возврата строки неопределенной длины, я не могу вернуть массив строк определенной длины.
Эта функция, например, не компилируется
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[])
. Я этого совсем не понимаю. Есть ли обходной путь?
Ответ №1:
Вы пытаетесь вернуть динамический массив ( string[]
), но на самом деле return
оператор создает экземпляр фиксированного массива ( string[5]
).
Быстрое исправление: Возврат string[5] memory
(вместо string[] memory
).
В настоящее время Solidity (версия 0.8) не может изменять размер массива в памяти. Таким образом, вы не можете просто определить пустой динамический массив в памяти, а затем push()
в него. Но есть обходной путь для возврата динамического массива, содержащего предопределенный список элементов:
Вы можете определить динамический массив с 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;
}
Комментарии:
1. О, фантастика. По какой-то причине я подумал, что string[]memory arr = новая строка[](5) тоже создаст массив фиксированной длины