Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verwende ich eine String-Enumeration mit einer Methode als generischem Parameter?

Wie verwende ich eine String-Enumeration mit einer Methode als generischem Parameter?

WBOY
WBOYnach vorne
2024-02-10 14:21:17993Durchsuche

Wie verwende ich eine String-Enumeration mit einer Methode als generischem Parameter?

Der PHP-Editor Youzi ist hier, um Ihnen die Verwendung der String-Enumeration mit Methoden als generischen Parametern vorzustellen. Bei der Programmierung müssen wir häufig Generika verwenden, um die Flexibilität und Wiederverwendbarkeit von Code zu erhöhen. Die Verwendung von String-Aufzählungen mit Methoden als generische Parameter kann unseren Code prägnanter und effizienter machen. Als Nächstes erläutern wir die Implementierung dieser Funktion und geben konkreten Beispielcode. Lassen Sie uns gemeinsam diese interessante Programmiertechnik erkunden!

Frageninhalt

Ich habe mehrere von Zeichenfolgen abgeleitete Aufzählungen, die ein gemeinsames validate() 方法(全部超出我的控制范围)。我想要一个通用方法,将字符串转换为这些枚举,并在生成的枚举上调用 validate() haben. Ich habe versucht, dies mithilfe von Generika zu erreichen, bin aber aus verschiedenen Gründen gescheitert.

Im folgenden Beispiel ist die Typbeschränkung zu stark und hindert mich daran, die validate()。我还尝试使用 validate()-Methode aufzurufen, um meine eigene Schnittstelle einzufügen und sie als Typbeschränkung zu verwenden, schlägt dann aber beim Typkonvertierungsteil fehl.

Wie kann ich dies erreichen, ohne die Enumeration zu ändern?

package main

// imagine i have multiple of those types outside of my control
type FooStatusEnum string

func NewFooStatusEnum(value FooStatusEnum) *FooStatusEnum {
    return &value
}

const (
    FooStatusEnumA FooStatusEnum = "A"
    FooStatusEnumB FooStatusEnum = "B"
    FooStatusEnumC FooStatusEnum = "C"
)

func (m FooStatusEnum) Validate() error {
    return nil
}

func stringToValidatedEnum[E ~string](s string) E {
    e := E(s)
    if err := e.Validate(); err != nil {
        panic(1)
    }
    return e
}

func main() {
    stringToValidatedEnum[FooStatusEnum]("A")
    e := FooStatusEnum("A")
    e.Validate()
}

Workaround

Verwenden Sie Typeinschränkungen, die die string 基础类型 validate()-Methode angeben:

type enumstring interface {
    ~string
    validate() error
}

func stringtovalidatedenum[e enumstring](s string) e {
    e := e(s)
    if err := e.validate(); err != nil {
        panic(1)
    }
    return e
}

Testen Sie es:

result := stringtovalidatedenum[foostatusenum]("a")
fmt.printf("%t %v", result, result)

Dies wird ausgegeben (versuchen Sie es auf Go Playground):

main.FooStatusEnum A

Das obige ist der detaillierte Inhalt vonWie verwende ich eine String-Enumeration mit einer Methode als generischem Parameter?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen