見出し画像

【9num】クラスもどき【開発記】


今回の概略

クラスもどきは Obj を新たに作ってそれに機能関数を追加していってそれを返す関数になるぽ😑
1つしか生成されない予定のモノsingletonなら直接ぶっこんでも良いけど作り方を統一しておいた方が混乱しない気がする🤔

#Misskey #Play #AiScript

9num
https://misskey.io/play/9dlcgfia6c

@test()
{
	let	this	= {prop: 3}
	this.view	= @(){<: `prop : {this.prop}`}
	return		this
}

let	a	= test()
let	b	= test()
b.prop	= 4
a.view()	//	prop : 3
b.view()	//	prop : 4


クラスもどき

9num のスクリプトとしての見どころは3つあって

・ Async
・ class モドキ
・ UI の部分更新

この class モドキ について書こうと思う🤤

@test()
{
	return	{
		prop: 3
		view: @(){<: `prop : {prop}`}
	}
}

最初に考えたのがこんな感じ😑
これだと「 prop なんて無いぞ」って怒られるのよね😞
で、 view のとこを `this.prop` とか `self.prop` とかしても this とか self なんて無いぞって言われるワケで…🙄
prop という名前が @test の外側に有れば勿論参照できるけどそれは当然中身が初期値3の prop ではないのよね…😞

で、途方に暮れてたところ

https://misskey.io/notes/9odmra10vo1j00rc

let this = {prop: 3}
this.view = @(){ <: `prop : {this.prop}` }

これ、該当部分で困ってた記事でも乗せたけど、要するに後から機能を追加する書き方🤤
JavaScript の prototype 方式に似てると思う🤔

// aiscript
@test()
{
	let	this	= {prop: 3}
	this.view	= @()
	{
		<: `prop : {this.prop}`
	}
	return		this
}

// JavaScript
function test()
{
	let	newobj	= {prop:3};
	newobj.prototype.view	= function()
	{
		console.log(`prop : ${this.prop}`)
	};
	return	newobj;
};

// newobj で書き直した aiscript
@test()
{
	let	newobj	= {prop: 3}
	newobj.view	= @()
	{
		<: `prop : {newobj.prop}`
	}
	return		newobj
}

なんで test っていう関数にして this に作ったのを return しているのかって?🤔

let test	= {prop: 3}
test.view	= @()
{
	<: `prop : {test.prop}`
}

let	a	= test
let	b	= test
b.prop	= 4
a.view()
b.view()

これ、 a と b が個別のオブジェクトとして動くと思う?🤔

そう、これは test っていう Obj の参照として a と b を作ったに過ぎなくなっちゃってるので b で prop をいじると当然同じ test の別名参照 a の prop も view の出力が同じになるってオチ😑

@test()
{
	let	this	= {prop: 3}
	this.view	= @()
	{
		<: `prop : {this.prop}`
	}
	return		this
}

同じコードもっかい出すけど、こっちだと「 this に新しい Obj 」を一旦作ってそれに view を追加して返す、という挙動の関数になるお🤤
`let this = {prop: 3}` の部分が new な Obj の生成を行ってるって事ね🤔

この記事を書いてる段階の aiscript では引数に初期値を割り当てる事ができないので `@test(arg)` みたいにして `let a = test()` みたいな呼び方は無理だけどクラスっぽいものを作れるのは確かなので機能毎に分離してデバグとか可能になるから少しは開発しやすくなるんじゃないかなと思う🤤
ただこのクラスもどきも欠点があって飽くまでも「もどき」なのでインスタンス(仮)が増えると結構メモリ喰うようになるってトコかな🤔
具体的には↑のコードだと view が生成したインスタンスもどき分だけ関数も作成されるのでそこも調整したいなって思う場合はかなりの工夫が必要になると思う😞
超大作以外では余り考えなくても良いとは思うけど…😑


次回は

UI の部分更新の事書こうかな🤤

この記事が気に入ったらサポートをしてみませんか?