1

私はscala 2.11.2を使用しています。これは私の機能の一部です:

import scala.reflect.runtime.universe._
p => p.filter(p => typeOf[p.type] != typeOf[Nothing]).flatMap {
    case Some(profile) => {
        ...
        env.userService.save(profile.copy(passwordInfo = Some(hashed)),...) //<---------error here
    }
    case _ => ...
}

コンパイルエラー:</p>

PasswordReset.scala:120: value copy is not a member of Nothing
[error]                   env.userService.save(profile.copy(passwordI
nfo = Some(hashed)), SaveMode.PasswordChange);
[error]                                                ^

フィルター フェーズ フィルターを Nothing 型で使用していると思いますが、なぜ型 Nothing エラーが発生するのでしょうか。したくないです:

profile.getDefault().copy(...)

デフォルト値をコピーするのではなく、プロファイルをコピーする必要があるため、プロファイルが Nothing の場合は削除するだけです。どうやってするの?

4

1 に答える 1

1

フィルターは型を変更しません。

scala> def f[A](x: Option[A]) = x filter (_ != null)
f: [A](x: Option[A])Option[A]

Option[A]入る、Option[A]出る。

フィルター関数の実行時チェックで、型パラメーターが Nothing ではないことを受け入れるようにコンパイラーに指示する必要があることを提案していますが、それは機能しません。

scala> f(None)
res2: Option[Nothing] = None

Nothing が推論された場合、Nothing が得られます。

コンパイラがどこかで Nothing を推論しないようにする必要があります。そのためには、明示的な型引数を提供する必要がある場合があります。

scala> f[String](None)
res3: Option[String] = None

scala> f[String](None) map (_.length)
res4: Option[Int] = None

と比較する

scala> f(None) map (_.length)
<console>:9: error: value length is not a member of Nothing
              f(None) map (_.length)
                             ^

ただし、コードを別の方法で表現することもできます。

于 2014-08-07T04:55:21.857 に答える