3

データベースにアクセスする Scala アプリケーションを作成しています。ほとんどの場合、利用可能な接続がありますが、接続できない場合もあります。私がやりたいことは、次のようなものです。

object User {
  def authenticate(username: String, password: String)
      (implicit conn: Connection): Option[User] = {
    // use conn to grab user from db and check that password matches
    // return Some(user) if so, None if not
  }
  def authenticate(username: String, password: String): Option[User] = {
    implicit val conn = DB.getConnection()
    authenticate(username, password)
  }
}

私が望んでいたのは、Connection使用可能な型の暗黙的な値がある場合、コンパイラは最初の方法を使用するということです。そうでない場合は、2 番目を使用します。残念ながら、私はコンパイラがそれほど賢くはないことを発見しました。

したがって、私の基本的な質問は、暗黙の引数を期待するメソッドを作成し、利用可能なものがない場合に暗黙のパラメーターの型の許容値を作成する同じメソッドのオーバーロードされたバージョンを提供する方法があるかどうかです。

あなたは、「どうしてそんなことをしたいの? 適切な型の受け入れ可能な値を作成できるのなら、どうしていつもそうしないの?」と言うかもしれません。開いているデータベース接続がある場合は、新しい接続を作成するよりも先に進んでそれを使用したいという点を除けば、それはほとんど真実です。ただし、開いているデータベース接続がない場合は、接続先を知っています。

つまり、簡単な答えは、2 つのメソッドに異なる名前を付けることですが、そうする必要はありません。しかし、多分私は...

ありがとう!トッド

4

2 に答える 2

9

オーバーロードされたメソッドは必要ありません。暗黙のパラメーターにデフォルト値を与えるだけです。

object User {
  def authenticate(username:String, password:String)(implicit conn:Connection = null): Option[User] = {
    val real_conn = Option(conn).getOrElse(DB.getConnection())
    // do the rest with the real_conn
  }
}
于 2012-07-19T03:30:12.587 に答える
0

私が考えることができるよりクリーンなソリューションは、ネストされたメソッドを使用し、誰かが提案したように、暗黙のデフォルト値を使用することです。

class Testclass {

  def myMethod(a:Int)(implicit b:Option[Int]=None):Int = {

    def myMethodInternal(a:Int, b:Int):Int = {
      // do something
      a+b
    }
    val toUse = b.getOrElse(30)
    myMethodInternal(a,toUse)
  }
}

メソッド内で myMethodInternal を定義します。これは、暗黙パラメーターを使用せず、明示パラメーターのみを受け取ります。このメソッドは myMethod 内でのみ表示され、次のように 2 番目のパラメーターを準備します。

  val toUse = b.getOrElse(30)

最後に、明示的なパラメーターを使用してメソッドを呼び出します。

  myMethodInternal(a,toUse)
于 2012-07-19T07:19:32.653 に答える