IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Developer123
Člen
Avatar
Developer123:7.1.2021 20:42

Automatické kopírovanie celých structov a classov, s možnosťou inicializácie niektorých memberov.

Zkusil jsem: Skúšal som to riešiť cez designated initializers, ale nenašiel som žiadny elegantný spôsob ako na to.

Chci docílit: F# keďže je funkcionálny jazyk má rôzne imutable typy, medzi inými aj typ record. Typ record z F# je veľmi podobný ako struct z C++ alebo record z pascalu, akurát je to referenčný typ (pomocou atribútu https://fsharp.github.io/…tribute.html môže byť record interne reprezentovaný aj ako hodnotový typ.

Výhoda recordov je že sú implicitne immutable (ak pri recorde nikde nepoužijeme slovo mutable).

Taktiež môžu obsahovať aj metódy (aj keď vo funkcionálnych jazykoch sa používajú skôr anemické objekty, takže do structu sa metódy pridávajú len výnimočne) a môžu dokonca aj implementovať interface (čo sa pri funkcionálnom programoavaní používa len málokedy), zato ale recordy nepodporujú dedičnosť. Ale namiesto dedičnosti majú veľmi zaujímavú vlastnosť vhodnú pre funkcionálne progrtamovanie.

Dá sa zobrať jeden record a druhý ním inicializovať príklad:

dajme tomu že máme typ:

type RGBAColor = { Red : int; Green : int; Blue : int; Alpha : single }

ten inicializujeme takto:

let RedPixel = {
    Red = 255
    Green = 0
    Blue = 0
    Alpha = 1.0f
}

a ak teraz dajme tomu že chceme nadefinovať nový žltý pixel (žltá je v RGB červená zmiešaná so zelenou) to znamená že namiesto toho aby sme takto definovali nový pixel:

let YellowPixel = {
    Red = 255
    Green = 255
    Blue = 0
    Alpha = 1.0f
}

tak môžme kludne zobrať ten červený a použiť operátor with:

let YellowPixel2 = { RedPixel with Green = 255 }

Ten nám skopíruje obsah celého RedPixel-u akurát property Green nastaví na inú hodnotu.

Rovnako vieme nastaviť aj viacero properties naraz:

let WhitePixel = {
    RedPixel with
        Green = 255
        Blue = 255
}

Pri funkcioanálnom programovaní, kde sa chceme vyhnúť zmenám hodnôt je to fajn.

Zaujímalo by ma či takýto syntaktický cukor (na automatické kopírovanie structu alebo class-u (s pár zmenenými hodnotami) má aj C++. A ak nie ako sa tieto veci v C++ riešia? Viem že sa to dá skopírovať manuálne a potom zmeniť hodnota, ale to už neni až také čisté riešenie. Chcel som si spraviť na jednom objekte fluent interface, ktoré vracia vždy nový objekt, ale hľadám podľa možnosti čo najmenej ukecané riešenie. Ďakujem.

POZN: Ak nechápete prečo nikde okrem deklarácie neuvádzam názvy typov tak je to kôli type inference. Typy treba explicitne uvádzať len tam kde by mohli navzájom kolidovať.

POZN2: okrem F# sa record rovnako kopíruje aj v ocaml (sekcia [b]Record copy[/b])

Odpovědět
7.1.2021 20:42
YOLO
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.