以下
DB.withSession {
implicit session =>
val user = users.filter(user => user.email === email
&& user.password === password).first
}
如何让IntelliJ向我展示隐式会话的定义?
答案 0 :(得分:2)
将光标放在表达式上,如果您使用的是默认的Intellij键盘布局,请按Ctrl+Shift+P
。或者通过菜单View
- > Implicit parameters
。
答案 1 :(得分:1)
session
在withSession
中定义,并作为参数传递给闭包。尝试放大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
的来源,你最终会发现。但它与隐含无关。