Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Trait methods have the same name as regular methods

未关闭
#44 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
5/5
预计耗时
一周以上
新手友好度
35/100
Issue 类型
重构
描述清晰度
基本清楚
活跃度
停滞
技术栈
cpp, go, rust

调研方向

首先跟踪 parser 输出如何填充 uniast.Type.Methods,以及 collect 阶段如何处理符号类型 Object。将 Rust 中的 trait 方法冲突与 issue 中描述的 C++ 父类/子类方法情况进行比较。完成的标准是选择并实现一种稳定的表示方式,在不依赖不稳定的 parser 输出的情况下区分同名方法。

由索引模型根据 Issue 内容生成。

描述

处理同名方法和 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 了的话,需要更好的设计,但先不考虑)

主要语言
Go
星标
391
派生
58
平均合并
2 天 21 小时
30 天内合并 PR
1

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

cloudwego/abcoder 的其他 Issue

查看 cloudwego/abcoder 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。