From 5c6c62c12a9fe5036790ce4e834c035367e8f2f1 Mon Sep 17 00:00:00 2001 From: Richard Thier Date: Fri, 11 Oct 2024 10:14:37 +0200 Subject: [PATCH] usings from odin in the docs as idea to stole maybe --- BASED.md | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/BASED.md b/BASED.md index ed41634..9678d0b 100644 --- a/BASED.md +++ b/BASED.md @@ -613,7 +613,7 @@ Ez jó kérdés, hogy legyen-e. A rust-os match statement-nek azért vannak elő ^^Szerintem a "checked switch" jellegű dolgok első körben elegek lesznek? Sőt a checked legyen szerintem a default! -## Öröklődés, polimorfizmus +## Öröklődés, polimorfizmus, like-olás generic - Nem lesz altípusos polimorfizmus. - Lesz generic / template jellegű fordítási idejű polimorfizmus @@ -625,6 +625,8 @@ Lennének ugye a hagyományos típusok, olyankor ezek "konkrétumot" jelentenek. nem valami dolog ami az "int-ből öröklődik". De ez igaz a konkrétság a nyelvben ugye így öröklődés hiányában igaz lenne a saját handle típusokra is (a struct-ok okosabb neve itt a handle). +### Like-olásos generic polimorfizmus + Ellenben megadhatjuk egy típusnak, hogy egy-egy mezője (annak típusa alapján) "legyen a mi típusunk más típusú 'nézete' ott"! Például: @@ -678,6 +680,41 @@ Még fontos azt is látni, hogy ilyen "int-like" vagy "MyHandleType-like" típus pedig csak definícióban / implementációnál! Tehát NEM lehet csinálni int-like arr[]; tömböt - csak mondjuk A arr[]; tömböt, de ez utóbbit viszont át lehet adni paraméterként a sort(..) függvénynek így! +### Odin-szerű "using"-ok + +Lásd: + + https://odin-lang.org/docs/overview/#using-statement-with-structs + +Ez szerintem hasonló a like-oláshoz - érdemes elgondolkozni, hogy legyen-e(odin kód alább): + + Vector3 :: struct{x, y, z: f32} + Entity :: struct { + position: Vector3, + orientation: quaternion128, + } + + foo :: proc(using entity: ^Entity) { + fmt.println(position.x, position.y, position.z) + } + + foo :: proc(entity: ^Entity) { + using entity.position + fmt.println(x, y, z) + } + +A like-olás másik formájával analóg dolog meg ez a rész(odin kód alább): + + Entity :: struct { + using position: Vector3, + orientation: quaternion128, + } + foo :: proc(entity: ^Entity) { + fmt.println(entity.x, entity.y, entity.z) + } + +Igazából szerintem lehet mindkettő, nagyon jó poszt-OOP tool mindkettő. + ## Tagged union tagged union AB { @@ -809,7 +846,7 @@ FONTOS: Talán érdemes volna kötelezővé tenni, hogy minden "esetnek" legyen leírt függvény esetén neked kelljen magadnak switch-case-elned a történetet (és az fusson le). Ezzel egy adott függvénynek vagy minden esetre kell legyen definíciója, vagy az únió eseteitől függetlenül álljon ott - de runtime error-t nem szeretnék! -## Interfészek +### Interfészek Zsolt vetette fel, hogy neki azért öröm töltené el a szívét, ha lehetne egy "kicsit OO style" azért annyiban, hogy egy tömbben tud keverni különböző típusú dolgokat, amiknek közös az interfésze és kapni ilyeneket függvény paraméterként... @@ -832,7 +869,7 @@ Megj.: A második változat (tagged union-os megoldás) kell szerintem + lehesse ott, hogy IGameObject-like és interfész "like-olása" mindig ezt jelentené? FONTOS: Adattagnak így nem lehet "interfész" típusa, csak tagged union-os esetben ugyebár... -## Láthatóság +### Láthatóság TODO: Egyszeűsítendő?