4

隐式转换似乎是 Scala 的一个主要且有争议的特性,而它们在 C# 中的重要性似乎要小得多。这两种语言有什么区别?是否有任何地方我被迫在 Scala 中使用隐式,或者我总是可以选择我希望转换是隐式的还是显式的,就像在 C# 中一样?通常在 C# 中,我喜欢显式地进行转换,以保持对程序员意图的类型检查,即使消费者是我自己也是如此。

我是否正确地说 C# 或 Scala 都不能隐式拆分或组合方法/函数参数?如 def myMethod(v1: Int, v2: Int) 将不接受 Tuple2[Int, Int] 作为其参数列表,而 def yourMethod(v1: Tuple2[Int, Int]) 将不接受两个整数作为其参数列表. 据推测,语言设计者必须考虑隐式/显式参数拆分/组合。当使用多个但相似的图形库的点结构时,我确实发现此功能是可取的。

4

2 回答 2

9

Scala 和 C# 隐式转换之间的主要区别在于 Scala 中更灵活的作用域规则,它允许您定义哪些隐式转换在哪些作用域中可用。

虽然在 C# 中,隐式转换是一种表示您的一个类可以被视为另一个类的方式,但在 Scala 中,它允许您仅在特定上下文中添加特定功能来装饰您的类。

此外,虽然 C# 中的隐式转换需要在类本身中定义,但在 Scala 中,您可以在外部添加隐式转换,这是装饰预先存在的类的强大工具:Scala 带有一组预定义的显式转换。

于 2012-06-27T13:20:57.153 回答
3

主要和有争议的功能

我不知何故错过了这场争议,所以我怀疑这是一个主要的争议。

隐式转换是可用的,但根据具体情况,经验丰富的 Scala 开发人员通常不赞成。

当存在通过“扩展”类将方法添加到类型的隐式转换时,它就会被接受。此扩展类不是用作参数、定义或变量的类型的类型,其方法也不返回自身,而是在适用的情况下返回原始类型。

当隐式转换在程序中通常使用的两种类型之间进行转换时,它被认为是一件坏事。事实上,Scala 2.10 会针对这种用法发出警告。

在可用于在 Java 和 Scala 集合之间转换的两个包中可以清楚地看到区别:scala.collection.JavaConversions 和 scala.collection.JavaConverters。后者的存在正是因为前者使用的隐式转换风格被认为是不好的。

Scala 确实允许您进行在特定范围内不可用的隐式转换,但我很少看到它使用过。另一方面,该标志-Xlog-implicit-conversions允许您跟踪隐式转换发生的位置。

在 Scala 的默认范围内没有很多隐式类型转换。AString可以被视为 a Seq[Char],“原始”数字类型具有类型扩展——也就是说,较小的类型可以被视为较大的类型。可能还有其他我现在不记得了,但是,一般来说,你必须导入一个隐式转换才能使用它。

于 2012-06-27T15:24:30.047 回答