Intellij - 查看隐式会话的来源

时间:2015-12-11 05:14:57

标签: scala intellij-idea

以下

DB.withSession {
   implicit session =>
     val user = users.filter(user => user.email === email 
       && user.password === password).first
 }

如何让IntelliJ向我展示隐式会话的定义?

3 个答案:

答案 0 :(得分:2)

将光标放在表达式上,如果您使用的是默认的Intellij键盘布局,请按Ctrl+Shift+P。或者通过菜单View - > Implicit parameters

答案 1 :(得分:1)

sessionwithSession中定义,并作为参数传递给闭包。尝试放大withSession

因此session在闭包中获得implicit,因此(可能)隐式传递给users.filter

非隐式版本可能看起来像这样(虽然没有真正检查/编译过它):

DB.withSession {
   session =>
     val user = users.filter(user => user.email === email 
       && user.password === password)(session).first
 }

答案 2 :(得分:0)

withSession可以像这样实现(非常简化)

def withSession(f: Session => Unit) {
  val session = getSession()
  f(session)
}

因此,此方法的创建者允许您对数据库执行某些操作,并且它们为您提供会话对象,而无需您知道它是如何创建的。您需要传递一个使用此会话的功能来执行您需要的任何操作。

DB.withSession { session => /* use your session here */ }

此外,您可以说这个限制在会话中的值是隐含的。就像你可以替换

val number = 3

implicit val number = 3

数字变为隐式,编译器可以将其作为隐式参数提供给需要它的方法。

以完全相同的方式使会话成为隐式值

DB.withSession { implicit session => /* use your session here */ }

如果任何方法在函数内部需要Session类型的隐式参数,编译器会将session放在那里。

回答这个问题:

  

如何让IntelliJ向我展示隐式会话的定义?

在这种情况下,你不需要去任何地方。隐含会话在此行中定义

DB.withSession {
  implicit session => // <<<<<
    val user = users.filter(user => user.email === email 
      && user.password === password).first
}

如果您想了解如何创建此会话并将其传递给您的函数,您应该使用例如 Ctrl + B 转到withSession的来源,你最终会发现。但它与隐含无关。