scala で次の概念を指定する最もきちんとした方法は何ですか? この概念は、コンパイル時に抽出されるクラスを指定する汎用抽出関数へのインターフェイスを表します。
契約の定義
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import scala.collection.JavaConversions._
trait ExtractorBase {
type ExtractedType
type RetType = Tuple2[Option[Seq[ExtractedType]],Option[Seq[String]]]
type ExtractorFunction = (Document) => RetType
def extractor : ExtractorFunction
}
class Extractor[T] (extractor_in: Any) extends ExtractorBase {
type ExtractedType = T
val extractor : ExtractorFunction = extractor_in
}
契約のインスタンス
//type TFunc = (Document) => Tuple2[Option[Seq[Int]],Option[Seq[String]]]
val ex = new Extractor[Int]( (x: Document)=> {
(Some(Seq(1)),Some(Seq("hassan")))
})
現時点では、エクストラクタ関数も正しくエイリアシングされていません:
[error] /Users/hassan/code/scala/extractor/hon.scala:14: type mismatch;
[error] found : Any
[error] required: org.jsoup.nodes.Document => (Option[Seq[Extractor.this.ExtractedType]], Option[Seq[String]])
[error] (which expands to) org.jsoup.nodes.Document => (Option[Seq[T]], Option[Seq[String]])
[error] val extractor : ExtractorFunction = extractor_in
trait を拡張するクラスの定義の外で一般的な trait データを参照するにはどうすればよいですか? コンパイル時、および実行時。コンパイル時間の例:
trait ExtractorBase[T] { type ExtractedType = T type RetType = Tuple2[Option[Seq[ExtractedType]],Option[Seq[String]]] type ExtractorFunction = (Document) => RetType def extractor : ExtractorFunction }
その後
class Extractor[T] (extractor_in: ExtractorBase[T].ExtractorFunction) extends ExtractorBase
C++ の特性に似ています。
実行時に、トレイトの型情報を取得することも気にしません。
Extractor[T]
おそらく、特性のインスタンスを作成するもっと慣用的な方法があります。クラスを通過する必要はありません。特性のコンパニオン オブジェクトでそれを行う方法はありますか?
編集
Ankur の答えは、私を正しい道へと導きました。レパートリーに # 演算子がありませんでした。これをドレスアップする時間。
trait ExtractorBase[T] {
type ExtractedType = T
type RetType = Tuple2[Option[Seq[ExtractedType]],Option[Seq[String]]]
type ExtractorFunction = (Document) => RetType
def extractor : ExtractorFunction
}
class Extractor[T] (extractor_in: ExtractorBase[T]#ExtractorFunction) extends ExtractorBase[T] {
def extractor : ExtractorBase[T]#ExtractorFunction = extractor_in
}
につながる:
val ex = new Extractor[Int]( (x: Document)=> {
(Some(Seq(1)),Some(Seq("hassan")))
})