我希望有一个函数可以使用可变数量的函数,但我希望它们在我实际使用之前不会被评估。我可以使用()=>类型语法,但我更喜欢使用=>类型语法,因为它似乎是为延迟评估而定制的。
当我尝试这样的事情时:
def functions(fns: => String*) = "OK"
我收到错误:
error: ')' expected but identifier found.
def functions(fns: => String*) = "OK"
有趣的是,当我将其更改为
时,它可以正常工作def functions(fns: () => String*) = "OK"
我需要做些什么才能让我的第一个功能起作用?
答案 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