복붙노트

[SCALA] 스칼라 데프 foo는 = {}와 데프 foo는 ()의 차이점은 = {} 무엇입니까?

SCALA

스칼라 데프 foo는 = {}와 데프 foo는 ()의 차이점은 = {} 무엇입니까?

스칼라 함수를 정의하는 다음과 같은 구조를 감안할 때, 당신은 그 차이가 무엇인지, 그리고 의미가 될 것입니다 무엇을 설명 할 수 있습니까?

def foo = {}

def foo() = {}

최신 정보

빠른 답변 주셔서 감사합니다. 다음은 중대하다. 나를 위해 남아있는 유일한 질문은 :

내가 괄호를 생략 할 경우, 기능을 주위에 전달하는 방법은 여전히 ​​존재? 이것은 내가 REPL에서 무엇을 얻을 수 있습니다 :

scala> def foo = {}
foo: Unit

scala> def baz() = {}
baz: ()Unit

scala> def test(arg: () => Unit) = { arg }
test: (arg: () => Unit)() => Unit

scala> test(foo)
<console>:10: error: type mismatch;
 found   : Unit
 required: () => Unit
              test(foo)
                   ^

scala> test(baz)
res1: () => Unit = <function0>

업데이트 2012년 9월 14일

여기에 내가 눈치 몇 가지 유사한 질문이 있습니다 :

해결법

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

    1.당신이 정의에서 괄호를 포함하는 경우 당신이 메서드를 호출 할 때 선택적으로이를 생략 할 수 있습니다. 당신이 정의를 생략하면 당신이 메서드를 호출 할 때 당신이 그들을 사용할 수 없습니다.

    당신이 정의에서 괄호를 포함하는 경우 당신이 메서드를 호출 할 때 선택적으로이를 생략 할 수 있습니다. 당신이 정의를 생략하면 당신이 메서드를 호출 할 때 당신이 그들을 사용할 수 없습니다.

    scala> def foo() {}
    foo: ()Unit
    
    scala> def bar {}
    bar: Unit
    
    scala> foo
    
    scala> bar()
    <console>:12: error: Unit does not take parameters
           bar()
              ^
    

    또한, 당신은 당신의 고차 기능이 비슷한 작업을 수행 할 수 있습니다

    scala> def baz(f: () => Unit) {}
    baz: (f: () => Unit)Unit
    
    scala> def bat(f: => Unit) {}
    bat: (f: => Unit)Unit
    
    scala> baz(foo)    
    
    scala> baz(bar)
    <console>:13: error: type mismatch;
     found   : Unit
     required: () => Unit
           baz(bar)
               ^
    scala> bat(foo)
    
    scala> bat(bar)  // both ok
    

    여기 바즈는 foo는 ()가 아닌 줄을 취할 것입니다. 이것은 무엇을 사용, 나도 몰라. 그러나 유형이 서로 다른 것을 보여 않습니다.

  2. ==============================

    2.제가 중복 된 질문에 게시 된 내 대답을 복사하자

    제가 중복 된 질문에 게시 된 내 대답을 복사하자

    0 인수에 대응 스칼라 방법 또는 괄호없이 정의 될 수있다 (). 이후 브로로서 구현 될 수없는 한, 반대로 이것은 (수 std 밖으로 프린트 아웃이나 데이터 파괴 등) 방법이 부작용의 일종되었음을 사용자에게 알리기 위해 사용된다.

    스칼라에서 프로그래밍을 참조하십시오 :

  3. ==============================

    3.두 번째 질문에 대답하기 위해, 단지를 추가 _ :

    두 번째 질문에 대답하기 위해, 단지를 추가 _ :

    scala> def foo = println("foo!")
    foo: Unit
    
    scala> def test(arg: () => Unit) = { arg }
    test: (arg: () => Unit)() => Unit
    
    scala> test(foo _)
    res10: () => Unit = <function0>
    
    scala> test(foo _)()
    foo!
    
    scala>            
    
  4. ==============================

    4.나는 항상 추천하는 기능 등으로 정의를 시작합니다 :

    나는 항상 추천하는 기능 등으로 정의를 시작합니다 :

    def bar {}
    

    단 경우에, 당신이 강제 될 때, 그것을 변경하려면 :

    def bar() {}
    

    이유 :의 가능한 사용의 관점에서이 두 기능을 살펴 보자. 그들은 전달 될 수있는 방법들이 infoked 수 있습니다 어디에.

    나는 모든이에게 함수를 호출 할 것입니다 :

    def bar {}
    

    그것은으로 호출 할 수 있습니다 :

    bar
    

    하지만 함수로 :

    bar()
    

    우리는 통화별로 이름 매개 변수와 함께 고차 함수를 정의 할 때 우리는이 줄을 사용할 수 있습니다 :

    def bat(f: => Unit) {
        f //you must not use (), it will fail f()
    }
    

    심지어 함수가 아닙니다 - 우리는 => 단위, 기억해야한다. 이 기능의 값이 저장 또는 주위에 전달 될 당신이 그것을 치료하기 위해 선택할 수 없습니다로하는 한 함수 인 것처럼 당신은 절대적으로 썽크 작동하지 않을 수 있습니다. 당신은 실제 인자의 발현 (그들 임의의 수)의 평가를 트리거 할 수 있습니다. 스칼라 : 중괄호 코드 블록으로 전달 함수

    (로 정의 된 함수는) 사용에 대한 더 큰 범위를 가지고있다. 그것은 막대로, 같은 맥락에서, 정확하게 사용할 수 있습니다 :

    def foo() = {}
    //invokation:
    foo
    //or as a function:
    foo()
    

    그것은 호출하여 이름 매개 변수를 함수에 전달 될 수있다 :

    bat(foo)
    

    또한, 우리가 통화 별 이름 pamameter을하지 받아들이는 고차원 적 기능,하지만 실제 함수를 정의하는 경우 :

    def baz(f: () => Unit) {}
    

    우리는 또한 바즈에 foo에 전달할 수 있습니다 :

    baz(foo)
    

    우리가 표준 기능을 볼 수 있듯이 foo는 같은 사용에 대한 더 큰 범위를 가지고있다. 그러나없이 정의 된 함수 ()를 사용하여 플러스 고차 함수를 정의, 즉 통화 별 이름 매개 변수를 받아, 우리가 더 명확 구문을 사용하자.

    당신은 더 나은, 더 읽을 수있는 코드를 보관하기 위해 시도하거나 통화 별 이름 매개 변수와 실제 함수로 정의 된 함수로 정의 함수에 코드를 모두 당신의 조각을 전달하는 능력을 필요로하는 경우, 다음 정의하지 않은 경우 하나의 표준으로 기능 :

    def foo() {}
    

    좀 더 명확하고 읽을 수있는 코드를 작성하는 것을 선호하고 기능이 더 부작용이없는 경우, 함수를 같이 정의한다 :

    def bar {}
    

    PLUS 통화 별 이름 매개 변수가 아닌 함수를 허용하도록 고차 함수를 정의하려고합니다. 당신이 강제되는 경우에만, 단이 경우 이전 옵션을 사용합니다.

  5. from https://stackoverflow.com/questions/7409502/what-is-the-difference-between-def-foo-and-def-foo-in-scala by cc-by-sa and MIT license