首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按名称重复的参数

按名称重复的参数
EN

Stack Overflow用户
提问于 2010-04-25 12:46:55
回答 6查看 2K关注 0票数 10

如何在Scala中传递按名称重复的参数?

以下代码无法工作:

代码语言:javascript
复制
scala> def foo(s: (=> String)*) = {
<console>:1: error: no by-name parameter type allowed here
       def foo(s: (=> String)*) = {
                   ^

有没有其他方法可以将可变数量的按名称参数传递给该方法?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-04-26 18:06:39

这不是很美观,但它允许您以varargs的方式传递byname参数

代码语言:javascript
复制
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中

票数 5
EN

Stack Overflow用户

发布于 2010-04-25 13:06:12

当前不支持重复的按名称参数。

票数 11
EN

Stack Overflow用户

发布于 2015-12-20 02:27:16

如果正在为良好的语法而苦苦挣扎,那么可以使用隐含来实现这个目标。

代码语言:javascript
复制
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:已评估的

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2707186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档