我正在编写一个访问数据库的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
的隐式值可用,编译器将使用第一个方法。如果没有,它将使用第二个。不幸的是,我发现编译器并没有那么聪明,或者,如果是的话,我没有告诉它该以正确的方式做什么。
因此,我的基本问题是,是否有一种方法可以编写一个方法,该方法需要一个隐式参数,然后提供同一方法的重载版本,如果没有可用的隐式参数类型的可接受值,则创建该方法的可接受的值。
你可能会说,"你为什么要做这样的事情?如果你能创建一个合适类型的可接受值,为什么不总是这样做呢?"这基本上是真的,只是如果我有一个开放的数据库连接,我更愿意继续使用它,而不是创建一个新的。但是,如果我没有开放的数据库连接,我知道在哪里可以获得。
我的意思是,简单的答案就是给这两个方法取不同的名字,但我不应该这样做,天哪。但也许我会…
谢谢!Todd
您不需要重载方法。只需给您的隐式参数一个默认值,即
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
}
}
我能想到的更干净的解决方案是使用嵌套方法,正如有人建议的那样,使用隐式函数的默认值。
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中可见,您将准备第二个参数,如下所示:
val toUse = b.getOrElse(30)
最后用显式参数调用您的方法:
myMethodInternal(a,toUse)