C'est parce que tu penses à l'objet contenu directement (d'ailleurs je parle avant d'objet aussi quand je devrais pas), plutôt que penser variable (le type fourre-tout, à comparer à interface{}). Il n'y a pas de cast explicite, mais dans l'abstrait (peu importe l'implémentation) on peut voir ça comme un cast d'un type implicite qui contiendrait tous les objets (d'un point de vue statique on ne sait en général rien sur le type de l'objet contenu dans une variable, donc interface{}), vers le sous-type des objets qui ont une méthode foo (implicitement défini en Ruby) afin d'appliquer la méthode, avec exception runtime si ce cast échoue (le contenu de la variable, c'est-à-dire l'objet caché derrière interface{}, n'est pas d'un type compatible).
En Go quand on appelle une méthode sur une interface comme en Ruby quand on appelle une méthode, le runtime va regarder une table de méthodes virtuelles pour trouver le code à appeler (ou plusieurs tables s'il y a des question d'héritages).
Ça c'est l'implémentation de l'appel, oui. Mais l'interprétation en terme de typage nous dit qu'en Go un appel méthode n'a pas besoin de faire de cast (on sait statiquement que le type de la variable est compatible avec cet appel méthode), alors qu'en Ruby on part toujours de l'équivalent interface{}, l'unique type statique de toutes les variables en Ruby, qu'on a besoin de caster vers un type (implicitement défini, pas vraiment dans le langage) à chaque appel.
[^] # Re: Go est lent, Rust est rouillé !
Posté par anaseto . En réponse au journal Explorer des langages de programmation - édition 2020. Évalué à 2.
C'est parce que tu penses à l'objet contenu directement (d'ailleurs je parle avant d'objet aussi quand je devrais pas), plutôt que penser variable (le type fourre-tout, à comparer à
interface{}). Il n'y a pas de cast explicite, mais dans l'abstrait (peu importe l'implémentation) on peut voir ça comme un cast d'un type implicite qui contiendrait tous les objets (d'un point de vue statique on ne sait en général rien sur le type de l'objet contenu dans une variable, doncinterface{}), vers le sous-type des objets qui ont une méthodefoo(implicitement défini en Ruby) afin d'appliquer la méthode, avec exception runtime si ce cast échoue (le contenu de la variable, c'est-à-dire l'objet caché derrièreinterface{}, n'est pas d'un type compatible).Ça c'est l'implémentation de l'appel, oui. Mais l'interprétation en terme de typage nous dit qu'en Go un appel méthode n'a pas besoin de faire de cast (on sait statiquement que le type de la variable est compatible avec cet appel méthode), alors qu'en Ruby on part toujours de l'équivalent
interface{}, l'unique type statique de toutes les variables en Ruby, qu'on a besoin de caster vers un type (implicitement défini, pas vraiment dans le langage) à chaque appel.