Wie führe ich einen Rückruf vom Typ „Generic' aus, der mehreren Rückgabetypen unterliegt?

WBOY
Freigeben: 2024-02-12 17:06:05
nach vorne
677 Leute haben es durchsucht

Wie führe ich einen Rückruf vom Typ „Generic aus, der mehreren Rückgabetypen unterliegt?

Frageninhalt

Ich versuche, in meiner Funktion einen Rückrufparameter zuzulassen, der mehrere Rückgabetupel ermöglicht. Um dies zu erreichen, verwende ich Generika, um die Parametertypen des Rückrufs zu definieren.

func get[
    in any,
    out any,
    translatefn func(in) out | func(in) (out, error),
](
    input in,
    translate translatefn,
) (*out, error) {
    // call translate to convert the input to the output.
    // if translate is an erroring function, make sure the error is
    // forwarded to the response of this function.
}
Nach dem Login kopieren

Da „translatefn“ auf einen dieser beiden Rückgabetypen (out(out, error)) beschränkt ist, dachte ich, ich könnte es aufrufen.

Was ich tun möchte, ist etwa Folgendes, kann es aber nicht, da ich keine Typzusicherung für den Parameter translate verwenden kann.

invalid operation: cannot use type assertion on type parameter value translate (variable of type translatefn constrained by func(in) out|func(in) (out, error))
Nach dem Login kopieren
func Get[
    In any,
    Out any,
    TranslateFn func(In) Out | func(In) (Out, error),
](
    input In,
    translate TranslateFn,
) (*Out, error) {
    if erroringFn, isErroringTranslateFn := translate.(func(In) (Out, error)); isErroringTranslateFn {
        out, err := erroringFn(input)
        if err != nil {
            return nil, err
        }
        return &out, nil
    }

    if nonErroringFn, isNonErroringTranslateFn := translate.(func(In) Out); isNonErroringTranslateFn {
        out, err := nonErroringFn(input)
        if err != nil {
            return nil, err
        }
        return &out, nil
    }

    panic("translate function must be either func(In) (Out, error) or func(In) Out")
}
Nach dem Login kopieren

Wie würde ich diesen Rückruf ohne Typzusicherungen aufrufen oder feststellen, welche allgemeinen Varianten bereitgestellt werden?

Workaround

Wickeln Sie es zuerst in eine Schnittstelle und führen Sie dann die Typzusicherung (oder den Typwechsel) durch. Zum Beispiel. any(v).(t)

func Get[
    In any,
    Out any,
    TranslateFn func(In) Out | func(In) (Out, error),
](
    input In,
    translate TranslateFn,
) (*Out, error) {
    switch f := any(translate).(type) {
    case func(In) (Out, error):
        out, err := f(input)
        if err != nil {
            return nil, err
        }
        return &out, nil
    case func(In) Out:
        out := f(input)
        return &out, nil
    }

    panic("shouldn't happen")
}

Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie führe ich einen Rückruf vom Typ „Generic' aus, der mehreren Rückgabetypen unterliegt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!