你能做一个匿名的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抱怨道。
答案 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