Assemblyscript: Array # splice๋Š” ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2020๋…„ 10์›” 12์ผ  ยท  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;
}

๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ( getArray ๋ฐ getString ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ์ˆ˜์ • ๋œ Loader ์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ) :

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 ๋“ฑ๊ธ‰