簡體   English   中英

Scala變量參數列表可能帶有call-by-name嗎?

[英]Scala variable argument list with call-by-name possible?

我有一些像這樣的代碼:

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

但是當我想將它轉換為具有可變長度的參數列表時,它將不再編譯(在Scala 2.10.0-RC2上測試):

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

我必須寫什么,它是這樣的?

您必須使用零參數函數。 如果你願意,你可以

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

有一個問題: 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語法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM