Assemblyscript: Array # splice não pode adicionar elementos

Criado em 12 out. 2020  ·  5Comentários  ·  Fonte: AssemblyScript/assemblyscript

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?

question

Todos 5 comentários

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

image

Sim, exemplo fixo. A propósito, você poderia melhorá-lo usando __realloc e memory.copy

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

solidsnail picture solidsnail  ·  5Comentários

kyegupov picture kyegupov  ·  3Comentários

jerrywdlee picture jerrywdlee  ·  4Comentários

Iainmon picture Iainmon  ·  3Comentários

blooddy picture blooddy  ·  3Comentários