Maison  >  Article  >  développement back-end  >  Impossible de déduire les types dans les paramètres génériques du constructeur de fonction

Impossible de déduire les types dans les paramètres génériques du constructeur de fonction

PHPz
PHPzavant
2024-02-09 08:00:32580parcourir

Impossible de déduire les types dans les paramètres génériques du constructeur de fonction

l'éditeur php Youzi répondra à une question commune à tout le monde : la raison pour laquelle le type ne peut pas être déduit des paramètres génériques du constructeur. En PHP, l'inférence de type pour les paramètres génériques est réalisée via la valeur par défaut du paramètre. Cependant, dans le constructeur, étant donné que les paramètres sont transmis avant la création de l'objet, le type des paramètres ne peut pas être déduit de l'instance de l'objet. Cela entraîne l'impossibilité de déduire le type du paramètre générique dans le constructeur, et le type doit être spécifié manuellement pour résoudre ce problème.

Contenu de la question

J'ai du code générique en cours où j'ai un type "maître" avec un paramètre générique et de nombreux types "esclaves" qui devraient partager le même paramètre générique. Le code ressemble à ceci :

type Doer[T any] interface {
    ModifyA(*A[T])
}

type B[T any] struct {
}

func NewB[T any]() *B[T] {
    return new(B[T])
}

func (b *B[T]) ModifyA(a *A[T]) {
    // Do a thing
}

type A[T any] struct{}

func NewA[T any]() A[T] {
    return A[T]{}
}

func (a *A[T]) Run(doers ...Doer[T]) {
    for _, doer := range doers {
        doer.ModifyA(a)
    }
}

func main() {
    a := new(A[int])
    a.Run(NewB())   // error here
}

En gros, l'utilisateur devrait être dans a 上定义 t ,然后 b 上的 t 应该是相同的。此类代码可以在支持泛型的其他语言中工作,但在 go 中,我在注释行处收到 cannot infer t 编译错误(请参阅此处的 go playground 代码)。在我看来, a 上的类型参数设置为 int ,因此 b 上的类型参数也应设置为 int 。我可以改为调用 newb[int]() , mais cela me semble trop verbeux. Pourquoi cela arrive-t-il?

Solution

Il s'agit d'une variante de "Pourquoi le compilateur ne peut-il pas déduire les paramètres de type en fonction de la façon dont le type de retour est utilisé ?" Réponse : Parce qu’à partir de la version 1.20, ce n’est pas ainsi que fonctionne l’inférence de type.

Inférence de typeS'applique à :

  • Liste des paramètres de type
  • Carte de remplacement m initialisée avec des paramètres de type connus (le cas échéant)
  • Une liste (éventuellement vide) d'arguments de fonction normaux (uniquement dans le cas d'appels de fonction)

Si vous vérifiez ces règles une par une :

  • newb() Existe-t-il une liste de paramètres de type ? Non. Vous l'appelez sans spécifier de paramètre de type.

  • Existe-t-il d'autres paramètres de type connus qui peuvent être utilisés pour déduire d'autres paramètres de type ? Non, vous n'avez fourni aucun paramètre de type. Notez que ce cas s'applique aux appels de fonction où vous fournissez un nombre partiel de paramètres de type, par exemple :

    func foo[T any, U *T]() {}

    En plus vous ne pouvez fournir que t,例如float64,编译器将使用 t -> float64 构造替换映射,然后推断 u -> *float64

  • Enfin, existe-t-il une liste des paramètres de fonctionnement normaux ? Non. newb est vide.

C'est tout. Le compilateur ne déduit pas les paramètres de type en fonction de la manière dont le type de retour de la fonction est utilisé.

Au moment de la rédaction, les propositions pertinentes en discussion sont :

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer