Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Trait methods have the same name as regular methods

Abierto
#44 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
5/5
Tiempo estimado
Más de una semana
Aptitud para principiantes
35/100
Tipo de issue
Refactorización
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
cpp, go, rust

Línea de trabajo

Empieza rastreando cómo la salida del parser rellena uniast.Type.Methods y cómo la fase collect gestiona el tipo de símbolo Object. Compara la colisión de métodos de traits en Rust con el caso de métodos de clase padre/hija en C++ descrito en el issue. Se considera terminado cuando se haya elegido e implementado una representación estable que distinga métodos con el mismo nombre sin una salida inestable del parser.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

处理同名方法和 trait 方法

考虑 rust 的例子:

struct Foo;
impl Foo            { fn say(&self) { println!("foo.say")      } }
trait Bar           { fn say(&self);                             }
impl Bar for Foo    { fn say(&self) { println!("Bar<Foo>.say") } }
fn g<T: Bar>(x: &T) { x.say();                                   }

Foo 的 say 方法应该有哪个?
按理说应该是 Foo.say,不是 Bar.say。
但是当前实现里,后者名为 say 也归属于 Foo,所以导致了重名函数的问题。
并且因为 uniast.Type.Methods[name] 只有一个函数,所以会导致 parser 输出不稳定。

要解决这个问题,有两个方法1

  1. 让 Bar.say 也归属于 Foo,把 uniast.Type.Methods 变成 name -> list[Identity]
  2. 让它单独归属于一个 trait object(标准 Rust 方法),需要在 collect 阶段处理 symbol kind Object。

同样,考虑到 C++ 有 OOP,类似问题存在,比如 Child.foo 重载 Parent.foo。
但是解决很简单,用亲类和后代类来区分就好。
(当然,如果有 C++ concept 了的话,需要更好的设计,但先不考虑)

Lenguaje dominante
Go
Estrellas
391
Forks
58
Merge medio
2 d 21 h
PR fusionados (30 d)
1

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de cloudwego/abcoder

Todos los issues de cloudwego/abcoder

Issues similares

Más issues de Go

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.