복붙노트

[SCALA] 통화 별 이름 수와 스칼라 변수 인수 목록?

SCALA

통화 별 이름 수와 스칼라 변수 인수 목록?

이 같은 일부 코드를 가지고 :

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

내가 가변 길이 인수 목록에이 변환 할 때, 그것은 더 이상 (스칼라 2.10.0-RC2에서 테스트) 컴파일되지 않습니다 :

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

나는 이런 식으로 작동하는지, 무엇을 작성해야합니다?

해결법

  1. ==============================

    1.대신 제로 인수 기능을 사용해야합니다. 하고 싶다면해도 돼

    대신 제로 인수 기능을 사용해야합니다. 하고 싶다면해도 돼

    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
    
  2. ==============================

    2.문제가 있습니다 : https://issues.scala-lang.org/browse/SI-5787

    문제가 있습니다 : 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)
      }
    }
    

    웃는 고양이 문법 실례합니다.

  3. from https://stackoverflow.com/questions/13307418/scala-variable-argument-list-with-call-by-name-possible by cc-by-sa and MIT license