2014-02-28 90 views
1

這不是一個關於implicit的問題 - 我知道它是如何工作的。這是關於一個特定的結構。這裏談到的MyBatis的一個相當普遍的彭定康斯卡拉:scala隱式值如何工作?

manager.readOnly { implicit session => { 
    //Code block: Do some DB operations in session 
    } 
} 

readOnly定義可以在這裏找到:https://github.com/mybatis/scala/blob/master/mybatis-scala-core/src/main/scala/org/mybatis/scala/session/SessionManager.scala

我如何閱讀:呼叫readOnly方法上manager與它的參數是一個函數,作爲參數的是session

我的問題是:哪裏隱含session值取自?哪個上下文?我不必自己定義任何session對象。

回答

2

我的問題是:隱式會話值取自哪裏?其中 上下文?我不必自己定義任何會話對象。

在這個例子中,implicit session是用於功能字面它開始正式參數聲明。因此,實際值由readOnly中的代碼提供,該代碼將在執行其操作時調用該函數。

這裏隱含的意思是爲了符號的方便,函數體中的代碼(我認爲這是一個Slick查詢)想要/需要/偏好一個隱式參數。 (隱式形式參數可能總是顯式地傳遞它們的實際參數)。

順便說一下,內支架是不必要的,應該省略。

3

隱式參數提供了一種方法來允許「找到」方法的參數。這意味着,如果沒有隨後被提供的參數值的編譯器將搜索根據解析規則範圍內所定義的「隱式」值:

  1. 變量已經被標記隱式被認爲是一個候選
  2. 顯式定義覆蓋implicits
  3. 局部範圍看第一
  4. 類伴侶搜索對象,如果它存在

Scala documentation是這麼WA Y:

首先,合格是可以在 點的方法調用的訪問沒有前綴,並且表示一個隱含 定義或隱含的參數的所有標識符X。其次,符合條件的所有 隱式參數類型的伴隨模塊的成員都是標記爲隱含的 。

似乎也有一堆邊緣情況下,並沒有一個很好的文件,所以我不鼓勵發瘋或有可能會出現意外。