Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Trait methods have the same name as regular methods

オープン
#44 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
5/5
見積もり時間
1週間以上
初心者へのやさしさ
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時間
マージ済み PR(30日)
1

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

cloudwego/abcoder のほかの issue

cloudwego/abcoder の issue をすべて見る

似ている issue

Go の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。