Scala是否提供了制作匿名val的方法?

时间:2015-01-25 09:16:41

标签: scala anonymous

你能做一个匿名的val吗?

我想做这样的事情:

case class NumIterations[A](num: Int)
case class Seed[A](seed: A)
case class Manipulate[A](f: A => A)
. . .

def funcWithGobsOfImplicitArgs[A](
  implicit numIterations: NumIterations[A],
           seed: Seed[A],
           manipulate: Manipulate[A],
           . . .
): A = . . .

def apply(): String = {
  implicit val NumIterations[String](10)  // This is where I want anonymous vals
  implicit val Seed("xyz")
  . . . 
  funcWithGobsOfImplicitArgs
}

好吧,隐藏函数参数的所有可能会过分,但我确实有一个真正的应用程序,它可以方便地将一些函数参数放在范围内然后重新使用并覆盖它们。这使得该功能的试验非常方便。我可以明确地一次使用一个参数,并隐式提供所有其他参数。

在这种情况下,不要命名val是很好的,因为名称会占用你头部的空间,而val的全部含义仅由它的类型提供。当我只有其中一个val时,我将其命名为_,认为Scala会将其视为一个永远不会被明确引用的val。但当我命名两个val _时,Scala抱怨道。

2 个答案:

答案 0 :(得分:1)

不,你需要命名你的val。一般来说,我认为你的想法使代码很难维护和理解。如果在一个上下文中,我有两个函数都有一个整数隐式参数,这两个参数的概念含义完全不同,我将定义两个不同的值类并将我的函数参数类型更改为这些值类,所以现在我将定义两个不同的val在上下文中键入这些值类。

class Arg1(arg: Int) extends AnyVal
class Arg2(arg: Int) extends AnyVal
def f1(implicit arg: Arg1)
def f2(implicit arg: Arg2)
implicit val arg1 = new Arg1(1)
implicit val arg2 = new Arg2(2)
f1 // will pick arg1
f2 // will pick arg2

但是如果参数的概念含义相同(比如ExecutionContext),那么我将它命名为executionContext并将其定义为上下文中的隐式,因此需要该参数的所有函数都将使用它。

答案 1 :(得分:0)

Scala 3(Dotty)提供了Anonymous Givens

given NumIterations[String](10)
given Seed[String]("xyz")
given Manipulate[String](identity)

funcWithGobsOfImplicitArgs

scastie