1
私はChiselを使用していますが、実際これはScalaの問題です。 私がしようとしているのは、派生オブジェクトの>演算子をオーバーライドすることです。 次のクラスを考慮すると:Scala/Chiselの型パラメータを持つOveride/Overload演算子
class Record extends Bundle {
val key = UInt(32.W)
val data = UInt(8.W)
def > (rhs:Record) = key > rhs.key
}
class RecordIndexed extends Record {
val index = UInt(8.W)
def > (rhs:RecordIndexed) = key > rhs.key || (key === rhs.key && index > rhs.index)
}
それから私はレコードから派生した任意のレコードタイプの一般的なコンパレータを構築したいと思います:
class Comparator[T <: Record](gen: T) extends Module {
val io = IO(new bundle {
val a = Flipped(Valid(gen))
val b = Flipped(Valid(gen))
val o = Output(Bool())
}
io.o := io.a.valid && io.b.valid && io.a.bits > io.b.bits
}
私は
Comparator(new Record)
を使用することはOKです
しかし、試してみると失敗します
Comparator(new RecordIndexed)
コンパイラは渡しますが、>演算子は常にRecordIndexedのものではなくRecordのものです。
なぜなら、>はオーバーライドではなくオーバーロードだからです。コンパイラのタイプTによると、コンパイラは>レコードから静的に選択します。
この問題を回避し、Scalaにオーバーロードを選択させるにはどうすればよいですか>。私は型付きの特性が行く方法だと思うが、完全にどのように把握することに失敗した。 @での質問に編集からコピー
サウンドあなたはタイプを使用するようにクラス。あなたはそれらを試しましたか? – dveim
@dveimいいえ。しかし、タイプクラスは非常に有望です。私は今夜試してみる。私はScalaで実際に経験はありません。これ以上ヒントや例があれば、非常に役に立ちます。 –
@dveim Typeclassが機能しました!これは本当にありがとう。私はそれを受け入れることができる簡単な答えを入れたいですか? –