Heim  >  Artikel  >  Backend-Entwicklung  >  Erstellen Sie eine Instanz eines generischen Typs mithilfe eines Zeigers auf einen Typparameter

Erstellen Sie eine Instanz eines generischen Typs mithilfe eines Zeigers auf einen Typparameter

WBOY
WBOYnach vorne
2024-02-09 13:57:201017Durchsuche

Erstellen Sie eine Instanz eines generischen Typs mithilfe eines Zeigers auf einen Typparameter

php-Editor Yuzai stellt in diesem Artikel vor, wie man Zeiger auf Typparameter verwendet, um Instanzen generischer Typen zu erstellen. Generics sind ein in der Programmierung weit verbreitetes Konzept, das es uns ermöglicht, allgemeinen Code zu schreiben, ohne bestimmte Typen anzugeben. Obwohl es in PHP keine native Unterstützung für Generika gibt, können wir Generika simulieren, indem wir Zeiger auf Typparameter verwenden. Diese Methode kann uns beim Schreiben von Code flexibler und effizienter machen und die Wiederverwendbarkeit und Wartbarkeit von Code verbessern. Im folgenden Inhalt werden wir detailliert beschreiben, wie diese Methode zum Erstellen von Instanzen generischer Typen verwendet wird, und einige Beispiele für praktische Anwendungen geben.

Frageninhalt

Angesichts dieser Typdefinitionen:

type n interface{ ~int | ~float32 | ~float64 }

type s[t any] struct {
    t t
}

type myint int

type pspmyint[t myint] *s[*t]
type spmyint[t *myint,] s[t]
type spmyint2[t myint] s[*t]

Ich kann eine Variante von type pspmyint

erstellen
func createps[t myint]() pspmyint[t] {
    var i t
    s := s[*t]{t: &i}
    return &s
}

Aber ich weiß nicht, wie ich die Variable von spmyintspmyint2 erstellen soll.

Das

func createSP[T myInt]() spMyInt2[T] {
    var i T
    s := S[*T]{t: &i}
    return s
}

Kompilierung fehlgeschlagen Sie können s (eine Variable vom Typ s[*t]) nicht als Typ spmyint2[t] in einer Return-Anweisung verwenden. 不能在return语句中使用s(s[*t]类型的变量)作为spmyint2[t]类型。

解决方法

首先,不要使用精确类型参数约束。这几乎没有任何意义。当您将函数声明为 createps[t myint]() 时,类型参数类型集的基数为 1,因此可以有效地由 myintLösungZuallererst: Verwenden Sie keine genauen Typparametereinschränkungen. Das macht fast keinen Sinn. Wenn Sie eine Funktion als createps[t myint]() deklarieren, hat der Typparametertypsatz die Kardinalität 1, sodass er effektiv durch myint nur

und

instanziiert werden kann Für immer

. Sie können die Funktion folgendermaßen umschreiben:

65bee32705632 s[*t] spmyint2[t] 不同。但是,由于 spmyint2[t] 的底层类型是 s[*t]Lösung für dieses Problem:

Typ s[*t] type spmyint[t *myint,] s[t] unterscheidet sich

von spmyint2[t]. Da der zugrunde liegende Typ von spmyint2[t] jedoch s[*t] ist, können Sie einfach Folgendes konvertieren:

65bee32705638 Was betrifft (wobei das Komma kein Tippfehler ist, sondern benötigt wird, um Mehrdeutigkeiten beim Parsen zu vermeiden), sind die Dinge nicht so einfach.

Das Problem besteht darin, dass die Typparameter spmyint[t *myint] 有一个类型参数约束为 *myint 并且函数 t 受基本类型 myint 约束,因此 *t 应该满足 phpcnc phpcnt * myint。这是不正确的,因为类型文字 *t 不等于 *myint 的明显不明显的原因。所以实际上你不能为 type spmyint[t *myint,] s[t] nicht

ihren Typbeschränkungen entsprechen. Daher kann ein Typliteral nicht zum Instanziieren eines anderen unbenannten Typliterals verwendet werden. Um es klar zu sagen:

// naive attempt that doesn't compile
func createsp1[t myint]() spmyint[*t] {
    var i t
    s := s[*t]{t: &i}
    return spmyint[*t](s)
}

Sie könnten denken, dass spmyint[t *myint] einen Typparameter hat, der auf *myint beschränkt ist, und dass die Funktion t durch die Basis gebunden ist Typ myint-Einschränkung, <em>daher</em> <code>*t sollte phpcnc phpcnt * myint erfüllen. Dies ist aus scheinbar nicht offensichtlichen Gründen falsch, da das Typliteral *t nicht gleich *myint ist. Eigentlich kann man also keinen universellen Konstruktor für 🎜 schreiben. 🎜 🎜Aber Sie haben Glück, denn die Typbeschränkung hat die Kardinalität eins. Sie können also den Typparameter entfernen: 🎜
func createSP1() spMyInt[*myInt] {
    var i myInt
    s := S[*myInt]{t: &i}
    return spMyInt[*myInt](s)
}

Das obige ist der detaillierte Inhalt vonErstellen Sie eine Instanz eines generischen Typs mithilfe eines Zeigers auf einen Typparameter. 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