9

私はこのようなコードを持っています:

def foo (s: => Any) = println(s)

しかし、これを可変長の引数リストに変換したい場合、それはもうコンパイルされません(Scala 2.10.0-RC2でテスト済み):

def foo (s: => Any*) = println(s)

このように機能するために、私は何を書かなければなりませんか?

4

2 に答える 2

11

代わりに、引数なしの関数を使用する必要があります。もし欲しかったらどうぞ

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

その後

def foo(s: (() => Any)*) = s.foreach(a => println(a()))

scala> foo("fish", Some(7), {println("This still happens first"); true })
This still happens first
fish
Some(7)
true
于 2012-11-09T12:23:59.527 に答える
6

問題があります: https ://issues.scala-lang.org/browse/SI-5787

受け入れられた答えについて、望ましい振る舞いを回復するには:

object Test {
  import scala.language.implicitConversions
  implicit def byname_to_noarg[A](a: => A) = () => a
  implicit class CBN[A](block: => A) {
    def cbn: A = block
  }
  //def foo(s: (() => Any)*) = s.foreach(a => println(a()))
  def foo(s: (() => Any)*) = println(s(1)())
  def goo(a: =>Any, b: =>Any, c: =>Any) = println(b)

  def main(args: Array[String]) {
    foo("fish", Some(7), {println("This still happens first"); true })
    goo("fish", Some(7), {println("This used to happens first"); true })
    foo("fish", Some(7), {println("This used to happens first"); true }.cbn)
  }
}

lolcatsの文法を失礼します。

于 2012-11-10T01:00:02.940 に答える