солидность: возврат(строка[] памяти) не позволит вернуть строку[5]?

#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) тоже создаст массив фиксированной длины