17

基本的に、使用する前に変数に格納することなく、カスタム エクストラクタを構築できるようにしたいと考えています。

これは私がどのように使用するかの実際の例ではありません。正規表現または構造のような他の文字列パターンの場合に使用される可能性が高くなりますが、うまくいけば、私が探しているものを説明できます:

def someExtractorBuilder(arg:Boolean) = new {
  def unapply(s:String):Option[String] = if(arg) Some(s) else None
}

//I would like to be able to use something like this 
val {someExtractorBuilder(true)}(result) = "test"
"test" match {case {someExtractorBuilder(true)}(result) => result }

//instead I would have to do this:
val customExtractor = someExtractorBuilder(true)
val customExtractor(result) = "test"
"test" match {case customExtractor(result) => result}

1 つのカスタム エクストラクタを実行するだけでは大きな違いはありませんが、case ステートメント用に大量のエクストラクタのリストを作成する場合は、すべてのエクストラクタをその使用法から分離することで、読みにくくなる可能性があります。

答えはノーだと思いますが、これはできませんが、最初に聞いてみようと思いました:D

4

5 に答える 5

8

エクストラクタをパラメータ化するのはクールですが、現時点ではそれらを実装するためのリソースがありません。

于 2010-03-16T13:45:06.757 に答える
4

いいえ。

8.1.7 抽出パターン

n ≥ 0 の抽出パターン x (p 1 , ... , pn ) は、コンストラクタ パターンと同じ構文形式です。ただし、ケース クラスの代わりに、安定した識別子 x は、パターンに一致する unapply または unapplySeq という名前のメンバー メソッドを持つオブジェクトを示します。

于 2010-03-09T20:10:51.020 に答える
2

遅くなりましたが、構文を提供するライブラリの 1 つに scalac プラグインがあります~(extractorWith(param), bindings)

x match {
  case ~(parametrizedExtractor(param)) => 
    "no binding"
  case ~(parametrizedExtractor(param), (a, b)) =>
    s"extracted bindings: $a, $b"
}

https://github.com/cchantep/acolyte/blob/master/scalac-plugin/readme.md

于 2014-02-25T01:30:02.020 に答える