WebHU - Programozási kérdések és válaszok

névtelen struktúratípus a függvényparaméterhez

Typescriptben ezt tudom megtenni:

function foo(param: { a: string, b: number }) { }

Egy objektumot fogadó függvény deklarálásához anélkül, hogy a paramétertípust kifejezetten elnevezett típusként deklarálnák, például:

interface Parameter {
    a: string;
    b: number;
}

function foo(param: Parameter) {}

Meg tudom ezt valahogy tenni Rustban, vagy kifejezetten deklarálnom kell a paraméter típusát nevesített típusként?

24.12.2020

Válaszok:


1

A Rust rendelkezik minta dekonstrukcióval a függvény paramétereihez sorokon, tömbökön és struktúrákon, például:

fn f((a, b): (u32, i32), [x, y, z]: [String; 3]) { }
struct A { a: u32, b: String }
fn g(A { a, b }: A) { }

De nincs ilyen szintaxisa a névtelen típusokhoz / objektumokhoz, mivel az objektumok egyszerűen nem léteznek a rozsdában. Képzeld el, hogy a rozsdának volt egy szintaxisa ehhez:

fn f(param: {a: String, b: String}) {} // Invalid code!

Hogy hívná valaki ezt a funkciót? Nincs mód ilyen típusú példány létrehozására. A javascriptben (/typescript) ez lehetséges, a dinamikus gépelés miatt, de a rozsdában ismerni kell egy típust, hogy meg tudd építeni.

Ha érdekli a kulcsszóargumentumok hamisítása a függvényekben, ez segíthet: Hogyan lehet a legjobban *hamisítani* kulcsszóstílus-függvény argumentumokat a Rust-ban?

Ha nevet szeretne adni a soroknak, valamint a paramétereiknek, akkor az instabil bindings_after_at-szolgáltatás engedélyezi ezt a szintaxist:

#![feature(bindings_after_at)]
fn f(my_tuple @ (a, b): (u32, u32)) {
    println!("this: {:?}", my_tuple);
    println!("is the same as: {:?}", (a, b));
}
// or this
fn g(arr @ [.., tail] : [u32; 5]) {
    println!("this: {}", arr[4]);
    println!("is the same as: {}", tail);
}
24.12.2020

2

Használhat tuplet:

fn foo(param: (String, usize)) {
    let a: String = param.0;
    let b: usize = param.1;
}

Ahelyett, hogy a mezőket, például a struktúrákat elneveznénk, a sorértékek indexelésre kerülnek. A sor strukturálása megkönnyíti az értékek nyomon követését:

fn foo((a, b): (String, usize)) {
    // you can now access `a` and `b` here
}
24.12.2020

3

A Rustban nem tehetsz ilyeneket, mert névleges típusú rendszere van, és a kódod a szerkezeti típusú rendszerek példája. A wikipédián olvashatsz róluk: https://en.wikipedia.org/wiki/Nominal_type_system https://en.wikipedia.org/wiki/Structural_type_system

A szerkezeti típusrendszerben a típus csak a mezőiből áll, és a neve és a definíciója nem számít. Ezzel szemben a nominális típusú rendszer 2 különböző deklarációjú, de azonos mezőkészlettel rendelkező típust kezel eltérőként (vagyis a típus neve fontosabb, mint a tartalom).

A rozsda azért választott névleges, mert feltűnőbb, és lehetővé teszi a program bizonyos tulajdonságainak típusszintű érvényesítését. Tekintsük ezt a példát:

struct Employee(String);
struct Customer(String);

fn handle_order(employee: Employee, customer: Customer){}

Ha a programozó hibázott, és handle_order(customer, employee)-ként hívja, akkor ez egy olyan hiba, amelyet a strukturális gépeléssel nem lehet észrevenni, de a névleges gépelésnél fordítási hibát vált ki.

Előfordulhat olyan helyzet is, amikor a programozónak módosítania kell a típusdefiníciót, például egy mezőt kell hozzáadnia a Employee-hoz. Ebben az esetben biztos lehet benne, hogy az átalakítás megtörtént, amikor az Employee minden felhasználása megoldódott. Strukturális tipizálást használó programban nem lehet biztosra menni, mert előfordulhat olyan kód, amely a Vevőt küldi el helyette, és így a strukturális típusos programok átalakítása kicsit nehezebb.

A névleges gépelés másik híres példája a Rust nyelvben az élettartamok. Az azonos típusú és eltérő élettartamú változóknak valójában különböző névleges típusai vannak. És minden Rusts biztonság ezen alapul.

A Typescript strukturális gépelést használ, mert könnyebben leképezhető JavaScriptbe.

24.12.2020
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..