Üst düzey işlevler için isteğe bağlı bağımsız değişkenler

0

Soru

Bunun için bir bağlayıcı yazmaya çalışıyorum. socket.io.

Bir işlevle ilgili sorun yaşıyorum (next() alttaki örnek kodumda), bu argüman veya hata nesnesi almaz (Js.Exn.raiseError("ERROR!")).

Her iki argüman türünü de ilk değer olarak alabilecek bir işlev imzası tanımlamanın bir yolunu bulamıyorum.

Sorduğum şeyin rescript'te mümkün olup olmadığından bile emin değilim, bu sorunu uygun rescript şekilde çözmek için herhangi bir yardım takdir edilecektir.

Şu anki uygulamam şöyle görünüyor:

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

En iyi cevabı

2

Genel olarak değişken sayıda argümana sahip bir işleve sahip olmak mümkün değildir, ancak her ikisini de geçmek mümkündür undefined veya çoğu durumda eşdeğer olacak bir değer.

Bunu yapmanın bir yolu sadece kullanmaktır option tip. Yeniden tanımlarsak next olarak

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

bu gibi kullanabiliriz

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

aşağıdaki JavaScript'i üretecek olan:

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

Başka bir seçenek isteğe bağlı argümanlar kullanmak olabilir, ancak bu uncurrying ile çalışmıyor gibi görünüyor ve son zamanlarda derleyici yazarının düzeltmekle ilgilenmediği currying ile ilgili hatalar var, bu yüzden orada da çalışmayabilir, ancak denemeye değer olabilir:

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

Son olarak, zaten bazı bağlar var socket.io (bs-socket.io). Bunlar maalesef bu davayı da ele almıyor, ancak sizi en azından bazı tekerlekleri yeniden icat etmekten kurtarabilir.

2021-11-20 18:44:49

Diğer dillerde

Bu sayfa diğer dillerde

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