3

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

当我尝试这样的事情时:

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

我得到错误:

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

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

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

我必须做什么才能让我的第一个功能正常工作?

4

2 回答 2

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

编辑:然后我想,不是有人问过吗?这里使用隐式还有几个答案。我认为我的回答应该只为“这曾经首先发生”而投票。

于 2012-11-25T07:33:08.403 回答
3

现在,您必须使用() => X*for 重复参数。这使得进入它们很痛苦,所以你可能希望

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
于 2012-11-25T13:26:03.663 回答