gpt4 book ai didi

斯卡拉;你能把多个参数定义为一个吗

转载 作者:行者123 更新时间:2023-12-04 17:54:09 26 4
gpt4 key购买 nike

你能定义一组变量供以后使用吗?

这里有一些伪代码突出了我的意图:

def coordinates = x1, y1, x2, y2

log("Drawing from (%4.1f, %4.1f) to (%4.1f, %4.1f)".format(coordinates))
canvas.drawLine(coordinates, linePaint)

这是一个包含重复代码的工作示例。

log("Drawing from (%4.1f, %4.1f) to (%4.1f, %4.1f)".format(x1, y1, x2, y2))
canvas.drawLine(x1, y1, x2, y2, linePaint)

最佳答案

是的,你可以,虽然语法可以说是非常笨拙,而且有一些限制,一开始可能看起来有点武断。诀窍是将方法转换为函数(称为“eta 扩展”),然后使用该函数的 tupled 方法获取可以应用于元组的内容。

假设你有这样一个类:

class Foo {
def f(a: String, b: String) = "%s, %s".format(b, a)
def g(x: Int, y: Int, z: Int) = x + y * z
}

还有一个实例:

val foo = new Foo

还有一些你想使用Foo的方法的数据:

val names = ("John", "Doe")
val nums = (42, 3, 37)

你不能只写 foo.f(names)foo.g(nums),因为类型不对齐——参数列表和元组在 Scala 中是不同的东西。但是你可以这样写:

scala> (foo.f _).tupled(names)
res0: String = Doe, John

scala> (foo.g _).tupled(nums)
res1: Int = 153

在方法将其转换为函数之后添加下划线(在我看来,这是 Scala 语法中最令人困惑的小怪癖),tupled 将其从具有两个(或三个)的函数转换具有单个元组参数的函数的参数。

您可以通过定义以下辅助函数来稍微清理一下代码,例如:

scala> val myF = (foo.f _).tupled
myF: ((String, String)) => String = <function1>

scala> val myG = (foo.g _).tupled
myG: ((Int, Int, Int)) => Int = <function1>

scala> myF(names)
res2: String = Doe, John

scala> myG(nums)
res3: Int = 153

不过,我不确定这是否更好。

最后,您不能(方便地)在 varargs 方法上使用这种方法——例如,您不能编写以下代码:

val coordsTupleToString = ("(%4.1f, %4.1f) to (%4.1f, %4.1f)".format _).tupled

甚至只是:

val coordsToString = "(%4.1f, %4.1f) to (%4.1f, %4.1f)".format _

这是在 Scala 中避免使用可变参数的另一个原因。

关于斯卡拉;你能把多个参数定义为一个吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11495298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com