En JavaScript normal:
fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2, 0, "Lemon", "Kiwi");
fruits // == ["Banana", "Orange", "Lemon", "Kiwi", "Apple", "Mango"]
Pero firma solo en AS:
function splice(start: i32, deleteCount?: i32): Array<T>
¿Alguna otra forma de empalmar datos en una matriz existente?
Actualmente, AS no puede realizar funciones variadas. Así que propongo esta solución alternativa para insertar nuevos elementos:
export function insertAfter<T>(arr: T[], index: i32, value: T): T[] {
const len = arr.length + 1
const res = new Array<T>(len)
if (index < 0) index = len + index - 1
if (index > len) index = len - 1
let i = 0
while (i < index) res[i] = arr[i++] // or use memory.copy
res[i++] = value
while (i < len) res[i] = arr[i++ - 1] // or use memory.copy
return res
}
// intead fruits.splice(2, 0, "Lemon", "Kiwi") use:
fruits = insertAfter(fruits, 2, "Lemon");
fruits = insertAfter(fruits, 3, "Kiwi");
@MaxGraey ¿Crees que podemos proporcionar esto mientras tanto en stdlib de alguna manera? ¿Como un spliceAndInsert
tomando una matriz en lugar de parámetros de descanso?
No creo que la matriz de elementos de inserción sea la solución adecuada. De todos modos, tenemos muchos otros lugares donde se necesitan funciones variadas, así que es mejor agregar el mecanismo adecuado para esto implementado en el compilador.
Muchas gracias @MaxGraey
insertAfter
funciona un poco diferente a lo anunciado, no es un reemplazo de matriz en el lugar, pero asigna una nueva matriz cada vez (por ejemplo, no usa realloc
internamente), por lo que necesita reasignación:
import {insertAfter} from "./insertAfter";
export function example(): string[] {
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits = insertAfter(fruits, 2, "Lemon");
fruits = insertAfter(fruits, 3, "Kiwi");
return fruits;
}
Y en el navegador (con un script Loader modificado que exporta getArray
y getString
):
fruits_ptr = assemblyscript.module.exports.example()
// 21359280
fruits = Loader.getArray(fruits_ptr)
// (6) [1152, 1184, 1312, 1616, 1216, 1248]
fruits.map(Loader.getString)
// (6) ["Banana", "Orange", "Lemon", "Kiwi", "Apple", "Mango"]
Sí, ejemplo fijo. Por cierto, podrías mejorarlo usando __realloc
y memory.copy