1

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")))
})
4

1 に答える 1

0

一般的な URL と項目 (またはその両方、またはいずれか、またはなし) を取得できる jsoup を使用した抽出関数の可能な一般的な仕様は、次のように定義できます。それは機能的で、慣用的なものです。改善できる場合は、コメントを提供してください。

import org.jsoup.nodes.Document

object ExtractorTraits {
  case class UrlPair[T](data: String, payload: Option[T])
  case class ResultPair[T,U](items: Option[Seq[T]],urls:  Option[Seq[UrlPair[U]]] = None)

  trait ItemExtractorTrait[I,C] {
    type ExtractedType = I
    type RetType = Option[Seq[ExtractedType]]
    type ExtractorFunction = (Document,Option[C]) => RetType
    def apply : ExtractorFunction
  }
  class ItemExtractor[I,C](extract_item : ItemExtractorTrait[I,C]#ExtractorFunction = (doc : Document,c: Option[C]) => None)
    extends ItemExtractorTrait[I,C] { val apply = (doc: Document, ctxt: Option[C]) => extract_item(doc,ctxt) }

  trait UrlExtractorTrait[U,C] {
    type UrlPayload = U
    type RetType = Option[Seq[UrlPair[U]]]
    type ExtractorFunction = (Document,Option[C]) => RetType
    def apply : ExtractorFunction
  }
  class UrlExtractor[U,C](extract_url : UrlExtractor[U,C]#ExtractorFunction = (doc:Document,c : Option[C]) => None)
    extends UrlExtractorTrait[U,C] { val apply = (doc: Document, ctxt:  Option[C]) => extract_url(doc,ctxt)}

  trait ExtractorTrait[I,U,C] {
    type RetType = ResultPair[I,U]
    type ExtractorFunction = (Document, Option[C]) => RetType
    def apply : ExtractorFunction
  }
  class Extractor[I,U,C] (item_extractor: ItemExtractorTrait[I,C]#ExtractorFunction = new ItemExtractor[I,C]().apply,
                        url_extractor: UrlExtractorTrait[U,C]#ExtractorFunction = new UrlExtractor[U,C]().apply) extends ExtractorTrait[I,U,C] {
    val apply = (doc: Document, ctxt: Option[C]) => ResultPair[I,U](item_extractor(doc,ctxt),url_extractor(doc,ctxt))
  }
}

編集

関数の特性を分割して、別々に作業できるようにします。

編集2

エクストラクタにコンテキストが追加されました

于 2013-11-14T12:43:08.597 に答える