比较来自世界各地的卖家的域名和 IT 服务价格

将列表或卡部署为函数的参数 Scala

是否可以动态扩展项目 list/tuple/map 作为函数的论据 Scala? 我正在寻找python的scala-thy
args

/
kwargs

-O .

例如,在 Python, 如果函数被定义为
def foo/bar1, bar2, bar3=None, bar4=1/

, 然后,如果有一个列表
x=[1,7]

和暗示
y={'bar3':True, 'bar4':9}

你可以打电话
foo

作为
foo/*x, **y/

.
已邀请:

知食

赞同来自:

只是清楚,下一个有效的代码 Python:


def foo/bar1, bar2, bar3=None, bar4=1/: print/"bar1="+str/bar1/+" bar2="+str/bar2/+" bar3="+str/bar3/+" bar4="+str/bar4//
x=[1,7]
y={'bar3':True, 'bar4':9}
foo/*x,**y/


但是,类似的语法 Scala 不存在。 有一些类似的东西,但主要原因是它永远不会成为可能的主要原因,它将违反所需的编译期间的测试检查 Scala. 让我们看起来很殷勤。

原因

首先,考虑瓦拉格戈夫的部分。 在这里,您希望能够传输任意长度的参数列表,并使用相应的功能参数填充它。 它永远不会工作 Scala, 因为类型检查要求允许传输到功能的参数。 在你的场景中
foo//

可以接受一个参数列表
x

长度,但不少。 但是
Seq

可以具有任意数量的参数,因为测试类型了解这一点
x

, 向他传输,在编译期间有效?

其次,考虑关键字的参数。 在这里,您可以询问功能接受任意
Map

参数和价值观。 但是你得到了同样的问题:编译期间检查的类型如何知道您通过所有必要的参数? 或者,此外,它们是正确的类型? 最后,一个例子 , 你给了哪个 - 这是一种包含逻辑值和逻辑值的卡 Int, 这将有类型
Map[String, Any]

, 那么类型检查如何了解这将适合您的参数类型?

一些解决方案

从 varargs Scala H。

你可以做一些类似的东西,但不是这一点。 例如,如果您已识别您的功能以进行显式使用 varargs, 你可以通过 Seq:


def foo/bar1: Int*/ = println/f"bar1=$bar1"/
val x = Seq/1, 2/
foo/x:_*/


它有效,因为 Scala 知道他只需要一系列零个或多个参数,以及 Seq 它将始终包含零个或多个元素,因此它一致。 此外,它只能有效,如果类型也一致; 在这里它期望序列 Ints 得到它。


tupled


你能做的另一件事 - 它被传达

法庭

论点:


def foo/bar1: Int, bar2: Int, bar3: Boolean = false, bar4: Int = 1/ = println/f"bar1=$bar1 bar2=$bar2 bar3=$bar3 bar4=$bar4"/
val x = /1, 2, true, 9/
/foo _/.tupled/x/


再次,它有效,因为检查类型 Scala 可以检查参数的正确性。 函数需要四种类型的参数 Int, Int, Boolean 和 Int, 自从摩托车以来 Scala 具有固定长度和已知的 /也许不同/ 每个位置的类型,类型检查可以验证参数对应于预期参数。

詹大官人

赞同来自:

原始答案不提到卡片处理作为夫妻列表 - 它可以很容易地转换为地图 /甚至是运营商 - > - 这只是一对夫妇的削减/.


def parse/options: /String, String/*/ = println /options.toMap/

冰洋

赞同来自:

一种边界案例 OQ, 但如果你想转移课堂的参数卡 case, 它似乎有效:


scala> case class myCC/foo: String = "bar", negInt: Int = -1/

scala> val row = myCC//
scala> println/row/
myCC/bar,-1/

scala> val overrides = Map/"foo" -> "baz"/
scala> row.getClass.getDeclaredFields foreach { f =>
f.setAccessible/true/
overrides.foreach{case /k,v/ => if /k == f.getName/ f.set/row, v/}
}
scala> println/row/
myCC/baz,-1/


/借来的
https://coderoad.ru/28458881/
/

郭文康

赞同来自:

您可以使用语法 varargs:


def printAll/strings: String*/ {
strings.map/println/
}


不,您可以使用此功能:


printAll/"foo"/


所以:


printAll/"foo", "bar"/


关于:


printAll/"foo", "bar", "baz"/

要回复问题请先登录注册