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*繰り返しパラメータに使用する必要があります。これは彼らに入るのを苦痛にするので、あなたはしたいかもしれません

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 に答える