¿Cuál es la mejor práctica para concatenar arreglos en Solidity?
Tengo esto (que compila):
contract Concatenator {
address[] Accounts1;
function ConcatenateArrays(address[] Accounts2){
uint i = 0;
while (i++ < Accounts2.length) {
Accounts1.push(Accounts2[i]);
}
}
}
Sin embargo, tengo la sensación de que podría haber una mejor manera de hacerlo. De ahí esta pregunta.
Además, noté que, si paso las 2 matrices a la función, aparece un error de memoria. ¿Por qué no puedo pasar las dos matrices directamente a la función?
El código en la pregunta se ejecuta sin gas porque i
debe incrementarse después, Accounts1.push(Accounts2[i]);
de lo contrario, Accounts2[i]
es un acceso fuera de los límites. Más fácil de usar un for
bucle:
contract Concatenator {
address[] Accounts1;
function ConcatenateArrays(address[] Accounts2){
for (uint i=0; i < Accounts2.length; i++) {
Accounts1.push(Accounts2[i]);
}
}
}
Al pasar 2 matrices a una función, no puede cambiar el tamaño de ninguna de ellas y debe asignar y devolver una nueva matriz. Aquí hay un ejemplo:
function ConcatenateArrays(address[] Accounts, address[] Accounts2) returns(address[]) {
address[] memory returnArr = new address[](Accounts.length + Accounts2.length);
uint i=0;
for (; i < Accounts.length; i++) {
returnArr[i] = Accounts[i];
}
uint j=0;
while (j < Accounts.length) {
returnArr[i++] = Accounts2[j++];
}
return returnArr;
}
Nota: memory
y la matriz de tamaño dinámico devuelta no es accesible desde otra función de Solidity (solo en web3.js): consulte ¿Cuáles son las dificultades o limitaciones comunes al codificar en Solidity?
NinjaMAN
ética