En JavaScript normal :
fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2, 0, "Lemon", "Kiwi");
fruits // == ["Banana", "Orange", "Lemon", "Kiwi", "Apple", "Mango"]
Mais signature en AS uniquement :
function splice(start: i32, deleteCount?: i32): Array<T>
Un autre moyen d'épisser des données dans un tableau existant ?
Actuellement, AS ne peut pas faire de fonctions variadiques. Je propose donc cette solution de contournement pour insérer de nouveaux éléments :
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 Pensez-vous que nous pouvons fournir cela pour l'instant dans stdlib d'une manière ou d'une autre? Comme un spliceAndInsert
prenant un tableau au lieu de paramètres de repos ?
Je ne pense pas que la gamme d'éléments d'insertion soit la bonne solution. Quoi qu'il en soit, nous avons beaucoup d'autres endroits où nous avons besoin de fonctions variadiques, il vaut donc mieux ajouter un mécanisme approprié pour cela implémenté dans le compilateur.
Merci beaucoup @MaxGraey
insertAfter
fonctionne un peu différemment de ce qui est annoncé, il ne s'agit pas de remplacer un tableau sur place, mais d'allouer un nouveau tableau à chaque fois (par exemple, en n'utilisant pas realloc
interne), il doit donc être réaffecté :
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;
}
Et dans le navigateur (avec un script Loader modifié qui exporte getArray
et 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"]
Oui, exemple fixe. Au fait, vous pouvez l'améliorer en utilisant __realloc
et memory.copy