Assemblyscript: Array#splice ne peut pas ajouter d'éléments

Créé le 12 oct. 2020  ·  5Commentaires  ·  Source: AssemblyScript/assemblyscript

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 ?

question

Tous les 5 commentaires

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"]

image

Oui, exemple fixe. Au fait, vous pouvez l'améliorer en utilisant __realloc et memory.copy

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

vladimir-tikhonov picture vladimir-tikhonov  ·  4Commentaires

drachehavoc picture drachehavoc  ·  6Commentaires

torch2424 picture torch2424  ·  5Commentaires

torch2424 picture torch2424  ·  3Commentaires

emil14 picture emil14  ·  3Commentaires