【问题标题】:Does Scala provide a way to make an anonymous val?Scala 是否提供了一种制作匿名 val 的方法?
【发布时间】:2015-01-25 09:16:41
【问题描述】:

你能做一个匿名验证吗?

我正在考虑做这样的事情:

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 抱怨了。

【问题讨论】:

  • 为什么不直接在函数参数中命名 vals,即implicit val seed = Seed("xyz")
  • @OlegGrenrus 实际上,这就是我一直在做的事情。我可以忍受它。不过,这似乎不是多余的吗?

标签: scala implicit anonymous


【解决方案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 并将其定义为上下文中的隐式,因此所有需要该参数的函数都将使用它。

【讨论】:

    【解决方案2】:

    Scala 3 (Dotty) 例如提供Anonymous Givens

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

    scastie

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多