scala - 如何在scala中使用带有 curry 函数的命名参数

标签 scala currying named-parameters

我有一个在 block 中使用的具有 4 个参数的方法。在每个 block 中,第一个参数始终相同:

// Block 1 - first parameter always "A"
foo(a="A", b="x", c="y", d="z")
foo(a="A", b=".", c=",", d="-")
foo(a="A", b="1", c="2", d="3")

// Block 2 - first parameter always "B"
foo(a="B", b="x", c="y", d="z")
foo(a="B", b=".", c=",", d="-")
foo(a="B", b="1", c="2", d="3")

我想要一种快速的方法来为每个 block 创建一个方法,这样我只需要指定其他 3 个参数。目前我可以这样做:
def fooCurried(a: String) = foo(a, _: String, _: String, _: String)

val fooA = fooCurreid("A")
fooA("x", "y", "z")
fooA(".", ",", "-")
fooA("1", "2", "3")

val fooB = fooCurried("B")
fooB("x", "y", "z")
fooB(".", ",", "-")
fooB("1", "2", "3")

这种方法的问题是我丢失了我的命名参数。他们变成了v1 , v2v3 .在这种情况下使用命名参数很重要,因为其他 3 个参数的类型相同,因此很容易混淆。

有没有一种干净的方法来定义 fooCurried像上面这样的函数,我可以在不同的上下文中轻松使用,但让我使用命名参数?

我想要一些我可以这样使用的东西:
def fooCurried(a: String) = ???

val fooA = fooCurreid("A")
fooA(b="x", c="y", d="z")
fooA(b=".", c=",", d="-")
fooA(b="1", c="2", d="3")

提前致谢!

最佳答案

这个怎么样 :

case class fooCurried(a: String) {
  def apply(b: String, c: String, d: String) = {
    // do something
    println(a + "," + b + "," + c + "," + d)
  }
}

你可以像这样使用它:
scala> val fooA = fooCurried(a = "A")
fooA: fooCurried = fooCurried(A)

scala> fooA(b="B", c="C", d="D")
A,B,C,D

scala> fooA(b="x", c="y", d="z")
A,x,y,z

关于scala - 如何在scala中使用带有 curry 函数的命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34922548/

相关文章:

scala - Monad 与顺序函数调用

通用 curry 函数的 typescript 类型

javascript - 将动态参数添加到函数,该函数的参数作为参数传递给当前函数

php - 带有命名参数的 vsprintf 或 sprintf,或者 PHP 中的简单模板解析

java - 使用 maven 构建的 spark 1.2 包 com.google.common 有错误

ScalaTest 共享行为函数提前失败

php - 是否可以在 PHP 中进行方法调用?

ruby - Ruby 中没有命名参数?

javascript - Javascript 中的命名参数不会覆盖现有值

scala - 错误:java.lang.NoSuchMethodError:com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;