例如我需要訪問函數def a[A:ClassManifest]
中的清單來獲取擦除類。我可以使用Predef.implicitly函數,但在這種情況下,我的代碼將會像使用完整形式def a[A](implicit b:ClassManifest[A])
一樣長。 那麼這些隱式參數是否有方便生成的名稱?如何訪問隱式「隱式」即def a [A:B]或def a [A <%B]?
回答
有在Predef
三個預定義的方法,將做到這一點對Manifest
S,ClassManifest
S和OptManifest
S:manifest[T]
,分別classManifest[T]
和optManifest[T]
。您可以根據相同的模式爲其他類型編寫自己的這種「隱式獲取器」。這裏是例如manifest[T]
:
def manifest[T](implicit m: Manifest[T]) = m
因此,這裏是你如何可以編寫自己:
trait UsefulTypeclass[A] {
def info = 42 // sample method
}
// the 「implicit getter」
def usefulTypeclass[A](implicit tc: UsefulTypeclass[A]) = tc
// a method that uses the implicit getter
def foo[A: UsefulTypeclass] =
usefulTypeclass[A].info
作爲一個巧妙的技巧:如果您將隱式getter命名爲「apply」並將其放在UsefulTypeclass的伴隨對象上,則可以使用「UsefulTypeclass [T]」作爲代表T類類型實例的值,而不必導入任何超過類型類本身。 – 2012-02-27 21:51:36
@RM好戲。我想它必須是'UsefulTypeclass [T]()'(帶額外的'()')。 – 2012-02-28 09:43:44
其實它不需要parens。如果你有(赦免缺少格式)對象TC {def apply [T](implicit x:TC [T])= x},你可以從字面上用「TC [SomeClass]」來調用它,因爲正在定義「apply」作爲帶有隱式參數列表的無參數方法,並且[SomeClass]僅從對TC對象的引用中消除歧義。它desugars到TC.apply [SomeClass](theImplicitValue) – 2012-02-28 15:23:47
scalap來救援!
我把這個代碼:
object TestThing extends App {
def one { println("one") }
def two[T] { println("two") }
def three[T : Manifest] { println("three") }
def four[T: Manifest, U : Manifest] { println("four") }
}
並運行它通過scalap。下面是我的了:
object TestThing extends java.lang.Object with scala.App with scala.ScalaObject {
def this() = { /* compiled code */ }
def one : scala.Unit = { /* compiled code */ }
def two[T] : scala.Unit = { /* compiled code */ }
def three[T](implicit evidence$1 : scala.Predef.Manifest[T]) : scala.Unit = { /* compiled code */ }
def four[T, U](implicit evidence$2 : scala.Predef.Manifest[T], evidence$3 : scala.Predef.Manifest[U]) : scala.Unit = { /* compiled code */ }
}
正如你所看到的,第一個隱含的清單被稱爲evidence$1
。第二個和第三個雖然在不同的範圍!-被稱爲evidence$2
和evidence$3
。所以......這就是你如何參考清單。
儘管如此,對我而言,刪除類中較高級的Manifest會更改位於文件較低位置的Manifest的名稱,這似乎有點可怕。同樣,IntelliJ Scala插件的語法突出顯示似乎也認爲four()
範圍內的清單變量是evidence$1
和evidence$2
,並且它認爲evidence$3
不是那裏的有效變量(儘管它是,和evidence$1
不是)。總體而言,也許這些事情應該被視爲關於使用隱式Manifest變量的警告信號?
- 1. 類型參數(F:((A,B))⇒B)(隱式CMP:訂貨[B]):(A,B)
- 2. 我怎樣才能DEF FOO [A]之間區分(XS:A *)和DEF FOO [A,B](XS:(A,B)*)?
- 3. 如何「a <= b && b <= a && a!= b」爲真?
- 4. 正則表達式(A或A或A和B),(A但不是B)
- 5. Python a,b = b,a + b
- 6. 簡化布爾表達式(a *'b *'c)+('a *'b * c)+('a * b *'c)+(a *'b * c)
- 7. 測試非整數是否在範圍[a,b) - 或[a,b],(a,b),(a,b)
- 8. 輸入(a + b)** 2,輸出a * a + a * b + b * a + b * b
- 9. 正則表達式!(A | B)例如不是(a或b)
- 10. 在階什麼是在總和A [B>:A](隱式NUM:數字[B]):乙
- 11. AutoMapper:請問<A,B>給<B,A>?
- 12. 搜索A/B或在露天4.2D「A/B」或A/B有問題
- 13. 使用'隱def`
- 14. 從{a-b,b-c,c-a}改變爲{(a,b),(b,c),(c,a)}?
- 15. 混合兩個矢量:[a a]和[b b] to [a b a b]
- 16. 'A','B'和'A或B'的T-SQL COUNT
- 17. SqlAlchemy如何查詢列A == a和B == b和A == b和B == a
- 18. 無法將類型'B <A>'隱式轉換爲'B <IA>'?
- 19. a = b + a的快捷方式;
- 20. A→B,B→A類協會
- 21. (A && B)與(A和B)
- 22. a + b如何不等於b + a?
- 23. SELECT <A OR B> FROM my_table其中A = 5或B = 5;
- 24. 類型模式的名稱:R a b = Q(a - >(R a b,b))
- 25. Scala的:DEF方法[A](一些PARAMS)與DEF方法(一些PARAMS)
- 26. python,訪問psycopg2形式def?
- 27. PHP變換陣列'a','b','c'到'a/b/c','a/b','a'
- 28. 隱藏列A
- 29. a,b = b,a + b和a = b,b = a + b在fibonacci中的區別是什麼[Python]
- 30. GROUP BY(A,B)和(B,A)
您可以隨時聲明一個名稱較小的方法,但不應該依賴Scalac生成的魔術名稱。 – 2012-02-28 14:43:06