重复的by-name / lazy函数参数

时间:2012-11-25 07:24:56

标签: scala types arguments

我希望有一个函数可以使用可变数量的函数,但我希望它们在我实际使用之前不会被评估。我可以使用()=>类型语法,但我更喜欢使用=>类型语法,因为它似乎是为延迟评估而定制的。

当我尝试这样的事情时:

  def functions(fns: => String*) = "OK"

我收到错误:

error: ')' expected but identifier found.
  def functions(fns: => String*) = "OK"

有趣的是,当我将其更改为

时,它可以正常工作
def functions(fns: () => String*) = "OK"

我需要做些什么才能让我的第一个功能起作用?

2 个答案:

答案 0 :(得分:3)

自提交问题以来:

https://issues.scala-lang.org/browse/SI-5787

可能会发生。

根据您的语义,考虑使用Stream [String],它会懒惰地评估。

  def foo(i: Int): String = { println(s"Numbering $i"); s"Number $i" }
  val invocations = foo(2) #:: foo(4) #:: foo(5) #:: foo(8) #:: Stream.empty

编辑:然后我想,没有人问这个问题吗?使用含义的几个答案here。我认为我的回答应该只是因为“过去曾经发生过”而被投票。

答案 1 :(得分:3)

目前,您必须使用() => X*来重复参数。这使得他们感到痛苦,所以你可能希望

implicit def anything_to_function0[A](a: => A): () => A = () => a

scala> def functions(fns: () => String*) = fns.length
functions: (fns: () => String*)Int

scala> functions("salmon","cod")
res2: Int = 2