隐含参数VS默认参数值

Yan*_*san 4 scala implicit

Scala中至少有两种技术可以将默认值传递给方法

1)默认参数值

scala> def f(i: Int = 0) = i
f: (i: Int)Int

scala> f()
res0: Int = 0

scala> f(1)
res1: Int = 1
Run Code Online (Sandbox Code Playgroud)

2)隐含参数

scala> def g(implicit i: Int) = i
g: (implicit i: Int)Int

scala> implicit val default = 0
default: Int = 0

scala> g(1)
res5: Int = 1

scala> g
res7: Int = 0
Run Code Online (Sandbox Code Playgroud)

在哪种情况下你选择一个或另一个?凭借隐式的力量,默认值是一个有用的功能吗?

sen*_*nia 12

你绝对应该更喜欢默认参数值.

  1. 你永远不应该创建或使用像Int或等一般类型的隐式参数String.见下面的引文.
  2. 默认值是最简单的解决方案.在语言功能方面的复杂性.
  3. 隐式参数适用于您的方法的某种"上下文".如果没有上下文,只是默认值,您可以混淆其他开发人员.
  4. 隐式值搜索会花费您一定的编译时间.
  5. 仅在极少数情况下应手动指定隐式参数.

另请参阅:Scala中的编程21.5隐式参数/隐式参数的样式规则:

作为样式规则,最好在隐式参数的类型中使用自定义命名类型.


Dan*_*ral 9

其他答案很有趣,它们提出了有效点,暗示了编译时间变慢和代码更复杂.

但是,我认为重要的是要理解,从某种意义上说,隐含和默认是互补的:

  • 使用默认值时,默认值由被调用者定义;
  • 使用implicits,默认值由调用者定义.

当然,库可能会提供其函数将使用的含义 - 您在Scala库中始终使用implicits而不必定义它们,对吧?

但是,当使用implicits时,调用者总是可以指定要使用的不同"默认值".

在任何一种情况下,都可以在调用函数时显式传递该值.

另一个小的区别是,可以选择通过命名参数覆盖哪些默认值,但如果您选择显式传递一个默认值,则必须传递所有默认值.

最后,请注意您可以同时使用隐式和默认.

  • `你可以在同一时间使用隐式和默认值,甚至隐含的默认值! (2认同)