Em JavaScript normal:
fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2, 0, "Lemon", "Kiwi");
fruits // == ["Banana", "Orange", "Lemon", "Kiwi", "Apple", "Mango"]
Mas assinatura apenas em AS:
function splice(start: i32, deleteCount?: i32): Array<T>
Qualquer outra maneira de unir dados em uma matriz existente?
Atualmente o AS não pode realizar funções variáveis. Portanto, proponho esta solução alternativa para inserir novo (s) item (ns):
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 Você acha que podemos fornecer isso por enquanto em stdlib de alguma forma? Como spliceAndInsert
pegando uma matriz em vez de parâmetros de descanso?
Não acho que a variedade de itens de inserção seja a solução adequada. De qualquer forma, temos muitos outros lugares onde precisamos de funções variáveis, então é melhor adicionar o mecanismo adequado para isso implementado no compilador.
Muito obrigado @MaxGraey
insertAfter
funciona um pouco diferente do anunciado, não é uma substituição de array in-loco, mas aloca um novo array a cada vez (por exemplo, não usa realloc
internamente), portanto, precisa ser reatribuído:
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;
}
E no navegador (com um script de carregador modificado que exporta getArray
e 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"]
Sim, exemplo fixo. A propósito, você poderia melhorá-lo usando __realloc
e memory.copy