في 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>
أي طريقة أخرى لربط البيانات في مجموعة موجودة؟
حاليا لا تستطيع 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"]
نعم ، مثال ثابت. راجع للشغل يمكنك تحسينه باستخدام __realloc
و memory.copy