如何在 Scala 中使用带柯里化函数的命名参数
How to used named parameters with a curried function in scala
我有一个在块中使用的带有 4 个参数的方法。在每个块中,第一个参数始终相同:
// 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")
我想要一种快速的方法来为每个块创建一个方法,这样我只需要指定其他 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
、v2
和 v3
。在这种情况下使用命名参数很重要,因为其他 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
:
case class Foo(a:String, b:String, c:String)
val f = Foo(a="a", b="b", c="c")
foo(f.copy(b ="b1", c="c1"))
但是您的 foo
将采用 class 作为参数而不是 4 个多个字符串。
这个怎么样:
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
我有一个在块中使用的带有 4 个参数的方法。在每个块中,第一个参数始终相同:
// 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")
我想要一种快速的方法来为每个块创建一个方法,这样我只需要指定其他 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
、v2
和 v3
。在这种情况下使用命名参数很重要,因为其他 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
:
case class Foo(a:String, b:String, c:String)
val f = Foo(a="a", b="b", c="c")
foo(f.copy(b ="b1", c="c1"))
但是您的 foo
将采用 class 作为参数而不是 4 个多个字符串。
这个怎么样:
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