如何在Scala中传递按名称重复的参数?
以下代码无法工作:
scala> def foo(s: (=> String)*) = {
<console>:1: error: no by-name parameter type allowed here
def foo(s: (=> String)*) = {
^有没有其他方法可以将可变数量的按名称参数传递给该方法?
发布于 2010-04-26 18:06:39
这不是很美观,但它允许您以varargs的方式传递byname参数
def printAndReturn(s: String) = {
println(s)
s
}
def foo(s: (Unit => String)*) {
println("\nIn foo")
s foreach {_()} // Or whatever you want ...
}
foo()
foo((Unit) => printAndReturn("f1"),
(Unit) => printAndReturn("f2"))这就产生了
在foo中
在foo f1 f2中
发布于 2010-04-25 13:06:12
当前不支持重复的按名称参数。
发布于 2015-12-20 02:27:16
如果正在为良好的语法而苦苦挣扎,那么可以使用隐含来实现这个目标。
implicit def arg2func(arg: ⇒ Byname): (() => Byname) = () ⇒ arg
def foo(params: (() ⇒ Byname)*): Unit = {
println("foo: not yet evaluated.")
params.foreach(_())
}
def boo(params: Byname*): Unit = {
println("boo: already evaluated")
}
foo(Byname(0), Byname(1), Byname(2))
println()
boo(Byname(3), Byname(4), Byname(5))
case class Byname(n: Int) {
println(n)
}这将打印:
foo:尚未评估。
1 0 1 2
3 4 5
boo:已评估的
https://stackoverflow.com/questions/2707186
复制相似问题