Trait methods have the same name as regular methods
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 35/100
調査の方向性
まず、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
- 让 Bar.say 也归属于 Foo,把 uniast.Type.Methods 变成 name -> list[Identity]
- 让它单独归属于一个 trait object(标准 Rust 方法),需要在 collect 阶段处理 symbol kind Object。
同样,考虑到 C++ 有 OOP,类似问题存在,比如 Child.foo 重载 Parent.foo。
但是解决很简单,用亲类和后代类来区分就好。
(当然,如果有 C++ concept 了的话,需要更好的设计,但先不考虑)
- 主要言語
- Go
- スター
- 391
- フォーク
- 58
- 平均マージ
- 2日 21時間
- マージ済み PR(30日)
- 1
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
cloudwego/abcoder のほかの issue
-
難易度 4/5 3〜5日 初心者へのやさしさ 42/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 55/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
-
難易度 3/5 1〜2日 初心者へのやさしさ 55/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
cloudwego/abcoder の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
-
bug group: validation priority: low
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
codecheckers/chekhov#51 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100