隐式和导入语句之间的区别

时间:2019-07-20 08:30:06

标签: scala import implicit

每个spark程序都有此行import spark.implicits._。当我在网上查看以了解Scala中“隐式”的用法时,我得到了以下定义:

Scala "implicits" allow you to omit calling methods or referencing variables directly but instead rely on the compiler to make the connections for you

我理解这个定义,但是它给我带来了以下疑问。

与其他任何import语句不一样吗?每个import语句都会带来我们希望在代码中使用它们的功能/选项/方法。 如果implicits与常规import语句不同,则它们将带到表中,又有什么不同? 任何人都可以解释implicits参数和函数的实际用例 在斯卡拉吗?

2 个答案:

答案 0 :(得分:0)

  

与其他任何import语句不一样吗?

是的。 implicits中的spark.implicits只是一个名字,而

  

导入spark.implicits ._

只是很不寻常,因为它会导入实例的成员,而其他许多诸如import之类的语言则无法做到(但是Scala可以做到)。

如果您查看docs for implicits,则会看到其成员被标记为implicit,这实际上使它们成为隐式的。

答案 1 :(得分:0)

隐式和导入在两者均用于为程序提供功能的意义上相似。区别在于隐式可以做到隐式。例如,假设我们有一个功能foo,它需要功能Bar,然后使用导入,我们必须 explicit ,其中该功能来自

import somepackage.Bar
def foo(b: Bar) = ???
val b = new Bar
foo(b)

使用隐式方法时,我们可以使编译器更加努力地为我们提供从复杂的隐式分辨率规则集所指定的“某处”提供此功能的功能

def foo(implicit b: Bar) = ???
foo

隐含性比进口更强大和灵活。例如,它们启用 typeclasses 的实现,这是一种提供多态功能而不依赖复杂的类层次结构的方法。我认为进口不可能做到这一点。