7

重複の可能性:
Scala:ブール値を返す短い形式のパターンマッチング

私のscalaコードでは、次のようなことをよく書いています。

x match{
   case Type(params) => doStuffWith(params)
   case _ => /* do nothing*/
}

これを行うための事前定義された演算子はすでにありますか?次のようなことを書くことができれば、はるかに明確になると思います。

if( x match Type(params)) {
    doStuffWith(params)
}

本質的に奇妙な場合を避けます。また、インラインでパターンと一致するものがあるかどうかを確認できると、余分な中括弧を節約できる状況もありました。

この種のことは、より反復的なコードを書くときにのみ役立つかもしれないことを私は知っていますが、Scalaには非常に多くの隠された機能があるようで、誰かがこれに対する簡単な解決策を持っているかどうか疑問に思いました。

4

4 に答える 4

7

lift部分関数fromtoAnyA関数fromtoAnyにできOption[A]ます。

構文を適切にするには、最初にヘルパー関数を定義します。

def lifted[A]( pf: PartialFunction[Any,A] ) = pf.lift

次に、利益を上げます。

val f = lifted {
  case Type(i) => doStuff(i)
}

scala> f(2)
res15: Option[Int] = None

scala> f(Type(4))
res16: Option[Int] = Some(8)

メソッドはdoStuff、引数が一致する場合にのみ呼び出されます。そして、あなたはいくつかのcase節を持つことができます。

于 2012-09-04T13:46:32.763 に答える
3

私が考えることができる最短の方法は、値をオプションでラップし、collectメソッドを使用することです。

Option(x).collect { case Type(params) => doStuffWith(params) }
于 2012-09-04T13:07:09.023 に答える
3

@ pant0mが提供したリンクを使用して、それを詳しく説明します。

import PartialFunction.condOpt

condOpt(x){ case Type(params) => doStuffWith(params) }
于 2012-09-04T17:37:03.460 に答える
0

doSomeStuffこのパターンがコードに頻繁に現れる場合は、のメソッドに変換することを検討する必要がありTypeます。Scalaのケースクラスは通常のクラスであり、意味がある場合はオブジェクト指向機能を使用する必要があります。

それ以外の場合は、すべてのケースクラスが共通の特性を拡張すると仮定して、階層の最上位にメソッドを追加できます。例えば:

class Base {
  def whenType(f: (T1, T2) => Unit): Unit = this match {
    case Type(t1, t2) => f(t1, t2)
    case _ => ()
  }
}

そして、あなたは使用することができますx whenType doSomeStuff

于 2012-09-05T07:36:04.507 に答える