Voliteľné argumenty pre vyššie funkcie objednávky

0

Otázka

Snažím sa napísať záväzné pre zásuvky.io.

Mám problém s funkciou (next() v mojom príklade kódu v spodnej časti), ktoré buď nie je nijako argument alebo chyba objekt (Js.Exn.raiseError("ERROR!")).

Nemôžem nájsť spôsob, ako definovať funkciu, podpis, ktorý môže mať obidva druhy argument ako prvú hodnotu.

Nie som si ani istý, či to, čo sa pýtam, je to možné v rescript, všetky pomôcť vyriešiť tento problém v správnom rescript spôsobom, chcel by som byť ocenil.

Moja súčasná implementácia vyzerá takto:

type server
type socket
type next = (. unit) => unit 

@new @module("socket.io") external socketIO: unit => server = "Server"
@send external use: (server, (socket, next) => unit) => unit = "use"
@send external listen: (server, int) => unit = "listen"
@send external on: (server, @string [ #connection(socket => unit) ] ) => unit = "on"

let io = socketIO()

io->use((socket, next) => {
    Js.log("FIRST")
    next(.)
})

io->use((socket, next) => {
    Js.log("SECOND")
    next(.)
})

io->on(#connection(socket => 
    Js.log("CONNECT")
))

io->listen(3000)
1

Najlepšiu odpoveď

2

Nie je možné vo všeobecnosti majú funkciu premennej počet argumentov, ale je možné odovzdať buď undefined alebo hodnoty, ktoré vo väčšine prípadov budú rovnocenné.

Jeden spôsob, ako to urobiť, je jednoducho použite option typ. Ak sme re-definovať next ako

type next = (. option<int>) => unit 

môžeme ich používať tak, ako je tento

io->use((_socket, next) => {
    next(. None)
    next(. Some(42))
})

ktorý bude generovať nasledujúce JavaScript:

io.use(function (_socket, next) {
      next(undefined);
      return next(42);
    });

Ďalšou možnosťou by mohlo byť použitie voliteľné argumenty, to ale nezdá sa, že práca s uncurrying, a nedávno tam boli chyby s currying, že kompilátor autor sa zdá, že nemá záujem v oprave, takže to nemusí fungovať, tam buď, ale to môže byť za záber:

type next = (~error: int=?, unit) => unit
...
io->use((_socket, next) => {
    next(())
    next(~error=42, ())
})

Napokon, už existuje nejaké väzby pre zásuvky.io (bs-zásuvky.io). Tie tiež nemusíte rukoväť tomto prípade bohužiaľ, ale to môže ušetriť od re-vymýšľajú niektoré kolesá najmenej.

2021-11-20 18:44:49

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................