Assemblyscript: Array#sambatan tidak dapat menambahkan elemen

Dibuat pada 12 Okt 2020  ·  5Komentar  ·  Sumber: AssemblyScript/assemblyscript

Dalam JavaScript biasa:

fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2, 0, "Lemon", "Kiwi");
fruits // == ["Banana", "Orange", "Lemon", "Kiwi", "Apple", "Mango"]

Tetapi tanda tangan hanya dalam AS:

function splice(start: i32, deleteCount?: i32): Array<T>

Adakah cara lain untuk menyambungkan data ke dalam array yang ada?

question

Semua 5 komentar

Saat ini AS tidak dapat melakukan fungsi variadic. Jadi saya mengusulkan solusi ini untuk memasukkan item baru:

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 Apakah menurut Anda kami dapat menyediakan ini untuk sementara di stdlib? Seperti spliceAndInsert mengambil array alih-alih params lainnya?

Saya tidak berpikir array item insert adalah solusi yang tepat. Bagaimanapun kami memiliki banyak tempat lain di mana membutuhkan fungsi variadic jadi lebih baik tambahkan mekanisme yang tepat untuk ini diimplementasikan dalam kompiler.

Terima kasih banyak @MaxGraey

insertAfter bekerja sedikit berbeda dari yang diiklankan, ini bukan penggantian array di tempat, tetapi mengalokasikan array baru setiap kali (misalnya tidak menggunakan realloc internal), sehingga perlu penugasan ulang:

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;
}

Dan di browser (dengan skrip Loader yang dimodifikasi yang mengekspor getArray dan 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

Ya, contoh tetap. Btw Anda bisa memperbaikinya menggunakan __realloc dan memory.copy

Apakah halaman ini membantu?
0 / 5 - 0 peringkat