Assemblyscript: Array # splice no puede agregar elementos

Creado en 12 oct. 2020  ·  5Comentarios  ·  Fuente: AssemblyScript/assemblyscript

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?

question

Todos 5 comentarios

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

image

Sí, ejemplo fijo. Por cierto, podrías mejorarlo usando __realloc y memory.copy

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

DanielMazurkiewicz picture DanielMazurkiewicz  ·  4Comentarios

lastmjs picture lastmjs  ·  4Comentarios

MaxGraey picture MaxGraey  ·  3Comentarios

jerrywdlee picture jerrywdlee  ·  4Comentarios

vladimir-tikhonov picture vladimir-tikhonov  ·  4Comentarios