Assemblyscript: لا يمكن لمصفوفة # لصق إضافة عناصر

تم إنشاؤها على ١٢ أكتوبر ٢٠٢٠  ·  5تعليقات  ·  مصدر: AssemblyScript/assemblyscript

في JavaScript العادي:

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

لكن التوقيع في AS فقط:

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

أي طريقة أخرى لربط البيانات في مجموعة موجودة؟

question

ال 5 كومينتر

حاليا لا تستطيع AS القيام بوظائف متنوعة. لذلك أقترح هذا الحل لإدراج عنصر (عناصر) جديدة:

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 هل تعتقد أنه يمكننا توفير هذا في هذه الأثناء في stdlib بطريقة ما؟ مثل spliceAndInsert يأخذ مصفوفة بدلاً من باقي المعلمات؟

لا أعتقد أن مجموعة العناصر المدرجة هي الحل المناسب. على أي حال ، لدينا الكثير من الأماكن الأخرى التي نحتاج فيها إلى وظائف متغيرة لذا من الأفضل إضافة آلية مناسبة لهذا المنفذ في المترجم.

شكرا جزيلا MaxGraey

insertAfter بشكل مختلف قليلاً عن المعلن عنه ، فهو ليس استبدال مصفوفة في الموضع ، ولكن تخصيص مصفوفة جديدة في كل مرة (على سبيل المثال ، عدم استخدام realloc داخليًا) ، لذلك يحتاج إلى إعادة التعيين:

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

وفي المستعرض (مع سكربت Loader معدل يقوم بتصدير getArray و 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

نعم ، مثال ثابت. راجع للشغل يمكنك تحسينه باستخدام __realloc و memory.copy

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات