2

私はScalaが初めてで、マッチを理解しようとしていました。

次のコードを実行しようとすると、javaw VM が応答しません (ずっと待機し続けます - Eclipse からこれを試します)。

case GenericProfile(user) => processGenericProfile(_)
case _ => println("Invalid data found")

ただし、次のセクションは問題なく機能します。

case GenericProfile(user) => processGenericProfile(GenericProfile(user))
case _ => println("Invalid data found")

最初のシナリオが応答しない理由を理解しようとしています。GenericProfile(user) を渡したくありません - これを簡素化する方法を知りたいです。タナクス!!

4

1 に答える 1

8

processGenericProfileとがどのようGenericProfileに定義されているかを確認せずに確認するのは難しいですが、最初のケース ( case GenericProfile(user) => processGenericProfile(_)) は、部分的に適用された関数を返すだけprocessGenericProfileで、ケースの左側の結果に適用しないと思います。 ..

この REPL セッションについて考えてみましょうprocessGenericProfileGenericProfile

scala> case class GenericProfile(user: String)
defined class GenericProfile

scala> def processGenericProfile(u: GenericProfile) = "processed"
processGenericProfile: (u: GenericProfile)java.lang.String

scala> GenericProfile("Paolo") match {
     | case GenericProfile(user) => processGenericProfile(_)
     | case _ => "wrong"
     | }
res0: java.lang.Object = <function1>

match?の戻り値の型を参照してください。行き詰まっていない可能性が高く、マッチは関数を返し、それを適用しないため、何かが起こるのを待っていますが、scala は、やりたいこと (関数を返す) が既に行われていると考えています。

GenericProfile含まれているユーザーだけでなく、全体をキャプチャする必要がある場合は、次のように、シンボルでエイリアスを使用できます。@

    scala> GenericProfile("Paolo") match {
         | case u @ GenericProfile(user) => processGenericProfile(u)
         | case _ => "wrong"
         | }
    res2: java.lang.String = processed

最後に一つだけ。case GenericProfile(user)「ユーザー」が何を表しているのかわかりません。私が書いた方法では、に含まれる値にバインドされた名前ですGenericProfile。つまり、最初のケースでは、「チェックしている項目が である場合、GenericProfileそれに含まれる文字列 (この場合は "Paolo") を取り、それを name にバインドしuserます。

右側でその値を使用していないため、次のこともできます。

case u @ GenericProfile(_) => processGenericProfile(u)

_左側の は、一致したユーザーを破棄していることを明示しており、タイプが であることを確認したいだけですGenericProfile

代わりに "user" が以前に定義した変数である場合 (つまり、case ステートメントで特定のユーザーの があることを確認したい場合GenericProfile)、scalauserにバインドしたい名前ではなく、定義したものであることを伝える必要があります。にあるものは何でもGenericProfileこれは、次のように、識別子 (ユーザー) を backticks で囲むことで実行できます。

val user="Paolo"

GenericProfile("Paolo") match {
    case u @ GenericProfile(`user`) => processGenericProfile(u) 
                                               //now this only matches                      
                                               //GenericProfile("Paolo")
    case GenericProfile(_) => "not Paolo"    
    case _ => "wrong"
}
于 2012-11-18T11:27:08.483 に答える