any? ici est une fonction qui renvoie vrai si un des éléments de la liste/tableau renvoie vrai pour un certain prédicat. Sans généricité, c'est impossible d'écrire un telle fonction qui marche pour des listes de n'importe quel type et les interfaces ne couvrent pas ce genre de cas. Le plus proche de any? qu'on puisse faire, c'est quelque chose comme (pas testé bien sûr) :
C'est proche de la fonction de Bruno en un peu plus général. Note en passant, cette généralité a peu de chances d'apporter grand chose si c'est utilisé toujours avec le même prédicat et, en un certain sens, la version Go de Bruno est plus lisible que la version Ruby justement du fait que le prédicat plus technique se retrouve dans une autre fonction plutôt qu'inline dans le corps de l'autre fonction. On pourrait voir ça comme un argument en faveur du fait que les limitations de Go nous encouragent parfois à écrire du code plus accessible.
Pour en revenir à nos moutons, on n'a pas moyen de rendre la signature plus générale et les interfaces vont pas pouvoir nous aider ici. Tu ne peux même pas définir l'interface dont la méthode serait Any(func (type de l'élément) bool) bool pour le type []couchdb.DocReference, car type de l'élément devrait être paramétré. Même si l'interface était possible à définir (généricité partielle juste pour les types des méthodes des interfaces), la méthode à définir pour chaque type satisfaisant l'interface serait la fonction que justement on voudrait écrire qu'une seule fois à la base.
[^] # Re: Go est lent, Rust est rouillé !
Posté par anaseto . En réponse au journal Explorer des langages de programmation - édition 2020. Évalué à 4.
any?ici est une fonction qui renvoie vrai si un des éléments de la liste/tableau renvoie vrai pour un certain prédicat. Sans généricité, c'est impossible d'écrire un telle fonction qui marche pour des listes de n'importe quel type et les interfaces ne couvrent pas ce genre de cas. Le plus proche deany?qu'on puisse faire, c'est quelque chose comme (pas testé bien sûr) :C'est proche de la fonction de Bruno en un peu plus général. Note en passant, cette généralité a peu de chances d'apporter grand chose si c'est utilisé toujours avec le même prédicat et, en un certain sens, la version Go de Bruno est plus lisible que la version Ruby justement du fait que le prédicat plus technique se retrouve dans une autre fonction plutôt qu'inline dans le corps de l'autre fonction. On pourrait voir ça comme un argument en faveur du fait que les limitations de Go nous encouragent parfois à écrire du code plus accessible.
Pour en revenir à nos moutons, on n'a pas moyen de rendre la signature plus générale et les interfaces vont pas pouvoir nous aider ici. Tu ne peux même pas définir l'interface dont la méthode serait
Any(func (type de l'élément) bool) boolpour le type[]couchdb.DocReference, cartype de l'élémentdevrait être paramétré. Même si l'interface était possible à définir (généricité partielle juste pour les types des méthodes des interfaces), la méthode à définir pour chaque type satisfaisant l'interface serait la fonction que justement on voudrait écrire qu'une seule fois à la base.