2012-06-27 50 views
4

隱式轉換似乎是Scala的一個主要和有爭議的特性,雖然它們在C#中的突出顯得少得多。 他們在兩種語言之間有什麼區別?有什麼地方我不得不在Scala中使用implicits,或者我總是可以選擇是否要像C#中那樣隱式或顯式地進行轉換?通常在C#中,我喜歡使轉換顯式化,以便維護程序員意圖的類型檢查,即使消費者是我自己。Scala和C中的隱式通話#

難道我說得對,沒有C#或斯卡拉可以隱式分離或合併方法/函數的參數?在def myMethod(v1:Int,v2:Int)中不會接受Tuple2 [Int,Int]作爲其參數列表,而def yourMethod(v1:Tuple2 [Int,Int])將不接受兩個ints作爲其參數名單。推測性的隱式/顯式參數分割/合併必須由語言設計者考慮。當使用多個但相似的圖形庫的點結構時,我確實發現了這個特性。

回答

3

主要和有爭議的特性

我莫名其妙地錯過了爭議,所以我懷疑它是一個主要的。

隱式轉換是可用的,但通常由經驗豐富的Scala開發人員所不同,具體取決於具體情況。

如果存在通過「擴展」類將方法添加到類型的隱式轉換,則會被接受。此擴展類不是用作參數,定義或變量的類型的類型,其方法也不會返回自身,而是原始類型(如果適用)。

當隱式轉換在程序中通常使用的兩種類型之間轉換時,它被認爲是一件壞事。事實上,Scala 2.10會提供這種用法的警告。 scala.collection.JavaConversions和scala.collection.JavaConverters:

的區別可以清楚地在提供給Java和Scala集合之間進行轉換的兩個包中可以看出。後者的存在恰恰是因爲前者中使用的隱式轉換風格被認爲是不好的。

Scala並讓你做出的隱式轉換所不具備的特定範圍內,但我很少看到它使用。另一方面,標誌-Xlog-implicit-conversions允許您跟蹤隱式轉換髮生的位置。

在Scala的默認範圍內沒有太多隱式類型轉換。 A String可以看作是Seq[Char],「原始」數字類型的類型擴展 - 也就是說,較小的類型可以被視爲較大的類型。可能有其他的我現在不記得,但是,一般來說,你必須導入一個隱式轉換才能使用它。

+0

關於爭議:也許我得到了棍棒的錯誤結局,但牽連似乎是「複雜性」辯論的底層。我注意到隱式創建正在被分流到SIP 18中的非默認功能中。 –

+1

@RichOliver「隱含」和「隱式轉換」不是同一件事。後者是以前者來實現的,但幾乎不是它的主要觀點。隱含的概念 - 與隱含的轉換相對,對於Scala來說非常獨特 - 確實是一些批評的目標。即便如此,我也不會把它置於複雜性辯論的「底層」。 –

+0

啊,這是我失蹤的重要信息。 –

9

Scala和C#的隱式轉換之間的主要區別是Scala中更靈活範圍的規則,它可以讓你定義哪些何隱式轉換可在作用域。

雖然在C#中的隱式轉換是一種方法,說,你的類可以被看作是另一個類,在Scala中,它允許你來裝飾你的類只在一定的語境中添加特定的功能。另外,儘管C#中的隱式轉換需要在類本身中定義,但在Scala中,您可以在外部添加隱式轉換,這是裝飾預先存在的類的強大工具:Scala帶有一組預定義的顯式轉換。

+0

+1最後一點 - 這真的是所有的差異。 –