복붙노트

[SCALA] 중괄호 코드 블록으로 전달 함수

SCALA

중괄호 코드 블록으로 전달 함수

몇 번 그와 같은 스칼라 코드를 보았다 :

object Doer{
   def doStuff(op: => Unit) {
      op
   }
}

이 방법으로 호출 :

Doer.doStuff{
      println("Done")
}

무엇이 나에게 이상한 것은 함수가 중괄호 사이의 코드의 단지 블록으로 다른 함수에 전달하는 방법이다. 그리고 일반적으로 시작을 표시하고 인수 목록의 끝에도 더 괄호가 없습니다.

이 스칼라 구문 / 기능의 이름은 무엇입니까? 어떤 경우에 나는 그것을 사용할 수 있습니까? 그것은 어디 문서화?

해결법

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

    1.이것은 인수 없음 기능 또는 썽크 중 하나라고 및 통화 별 이름 평가의 예이다 : http://www.scala-lang.org/old/node/138

    이것은 인수 없음 기능 또는 썽크 중 하나라고 및 통화 별 이름 평가의 예이다 : http://www.scala-lang.org/old/node/138

    당신은 어디서나 매개 변수 목록이 거의 nullaries를 사용할 수 있습니다. 그들은 그들이 보통의 값처럼 보이게, 그들은이 참조 될 때마다 호출, 인수 기능의 주위에 기본적으로 그냥 문법 설탕입니다.

    그래서

    def doSomething(op: => Unit) {
      op
    }
    doSomething {
      println("Hello!")
    }
    

    정확히 동일하다 :

    def doSomething(op: () => Unit) {
      op()
    }
    doSomething(() => println("Hello!"))
    

    한 가지는 그들이 뭔가 같은, 그들은 참조 될 때마다 호출됩니다 nullaries에 유의해야 할 사항은 다음과 같습니다

    def foo(op: => Int) = op + op
    foo {
      println("foo")
      5
    }
    

    두 번 "foo는"인쇄합니다.

    편집 : 제로 인수 함수의 인수 없음 기능 다릅니다가 nullaries하지 일류 값이다라고 랜달의 코멘트, 큰 방법 중 하나를 확장합니다. 예를 들어, 목록 [() => 지능이]하지만 당신이 목록 [=> Int 인]을 가질 수있을 수 있습니다. 그리고 당신은 같은 것을 가지고있는 경우 :

    def foo(i: => Int) = List(i)
    

    당신은 목록 만 반환 값에 null의 기능을 추가하지 않습니다.

  2. from https://stackoverflow.com/questions/22670356/passing-function-as-block-of-code-between-curly-braces by cc-by-sa and MIT license