gpt4 book ai didi

scala - Scala中的“传播”参数?

转载 作者:行者123 更新时间:2023-12-04 18:45:23 29 4
gpt4 key购买 nike

有什么方法可以调用带有单个参数的 Scala 函数,给定一个数组 (类似于 JavaScript
Spreads在 ECMAScript 6) 中?

ys = [10.0, 2.72, -3.14]
f(x, ...ys);

最简洁的语法是:
f(1, ys)

但这似乎是不可能的。偶 f(1, ys:_*)不起作用( f(ys:_*) 也不起作用,因为编译器报告的参数太少 - 只有第一个被填充)。

例子:
def f (a:Int, b:Float, c:Float, d:Float): String

val x = 1
val ys = List(10.0, 2.72, -3.14) // note: non-Objects
val result = f(x, ys) // intuitive, but doesn't work

用例:将测试数据(来自集合)注入(inject)到接受单个参数的现有方法中。由于这些是测试用例,因此如果 ys 中的 #params 不匹配并且会给出运行时错误或不正确的结果,那也没关系。

问题是 Scala 是否允许在给定参数集合的情况下调用带有单个参数的函数的简洁语法——而不是它是否是一个好的设计(尽管当然欢迎提出意见)。

最佳答案

将列表作为元组传递并不容易,因为类型不太匹配(稍后会详细介绍)。有了足够的鞋拔和润滑,任何东西都适合:

"My hack" should {
"allow a function to be called with Lists" in {

def function(bar:String, baz:String)= bar+baz


//turn the function into something that accepts a tuple
val functionT = function _
val functionTT = functionT.tupled

val arguments = List("bar", "baz")

//Give the compiler a way to try and turn a list into a tuple of the size you need
implicit def listToTuple(args:List[String]) = args match {
case List(a, b) => (a, b)
case _ => throw IllegalArgumentException("Trying to pass off %s as a pair".format(args))
}

//Shove it in and hope for the best at runtime
val applied = functionTT(arguments)
applied === "barbaz"
}
}

您可以通过将附加参数添加到列表中或通过 Schönfinkel 将参数分为两个不同组来扩展此方法。我不会那样做的。

从我的评论中你可能已经注意到我不喜欢导致这个问题弹出的设计。我展示的代码本质上是将函数包装在外观中的代码。为什么不正确地做呢?

查看 Spray,您可能会看到他们的完整方法隐式接受大量不同的参数。他们为此使用的巧妙技巧,他们将其命名为 Magnet Pattern .你可以做同样的事情,并为你选择接受的不同元组引入你的磁铁的隐式转换。

关于scala - Scala中的“传播”参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15170646/

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