processGenericProfile
とがどのようGenericProfile
に定義されているかを確認せずに確認するのは難しいですが、最初のケース ( case GenericProfile(user) => processGenericProfile(_)
) は、部分的に適用された関数を返すだけprocessGenericProfile
で、ケースの左側の結果に適用しないと思います。 ..
この REPL セッションについて考えてみましょうprocessGenericProfile
。GenericProfile
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"
}