복붙노트

[SCALA] 스칼라의 방법 대 기능

SCALA

스칼라의 방법 대 기능

나는 초보자를위한 Runar Bjarnason 현재 기능 프로그램을 시청하고, 그리고 14시 45분에서 그 방법을 정의한다 :

def isDivisibleBy(k: Int): Int => Boolean = i => i % k == 0

및 기능 :

val isEven = isDivisibleBy(2)

함수가 아닌 방법으로 ISEVEN 정의의 장점과 단점은 무엇입니까?

나는 스칼라 방법 대 기능뿐만 아니라 스칼라의 방법과 기능의 차이를 읽고, 나는 의미 론적 차이를 이해하지만, 함수 또는 방법을 사용하는 것이 바람직하지 않을 수 있습니다 왜이 경우 몇 가지 더 깊은 이유가 궁금 :

def isEven = isDivisibleBy(2)

해결법

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

    1.후드, 기능 및 방법 사이에 다른 차이가있다. 일반적으로 평범한 방법은 (기술적으로 적용되는 방법으로 목적) 함수보다 적은 오버 헤드를 생성.

    후드, 기능 및 방법 사이에 다른 차이가있다. 일반적으로 평범한 방법은 (기술적으로 적용되는 방법으로 목적) 함수보다 적은 오버 헤드를 생성.

    당신이 그 차이에 대해 걱정하지 않으려 고 서로 다른 의미와 필드와 데프, 발 및 VAR 생각한다면, 그것은 그 데프 단순히 발 한 번만 평가하면서 호출 될 때마다 평가입니다.

    그래서하는 발 ISEVEN = isDivisibleBy (2) (2)의 정의 중 isDivisibleBy를 호출하고 isDivisibleBy (2)의 결과를 할당해야합니다. 예를 들면 그것은 K의 대체

    def isDivisibleBy(k: Int): Int => Boolean = i => i % k == 0
    

    (2)와 (단 하나의 표현이있을 경우)의 최종 식의 결과를 대입

    val isEven: Int => Boolean = i => i % 2 == 0
    

    반면에 데프 ISEVEN은 isDivisibleBy의 호출 (2) 모든 시간에 그러한 평가 결과를하지 않습니다.

    즉 코드를 실행할 때, ISEVEN가 (11)가 발시 발생 후에 수단

    11 % 2 == 0
    

    와 DEF의 경우에, 당신은 할 수 있습니다

    isDivisibleBy(2)(11)
    

    만 평가 한 후 그 결과를 얻을 것이다 isDivisibleBy.

    당신은 차이를 볼 수 isDivisibleBy 일부 디버그 코드를 추가 할 수 있습니다 :

    def isDivisibleBy(k: Int): Int => Boolean = {
      println("evaluating isDivisibleBy")
      i => i % k == 0
    }
    
  2. ==============================

    2.여기 또 다른 점을 해결하고 싶습니다. 이 방법으로 ISEVEN을 정의한다 :

    여기 또 다른 점을 해결하고 싶습니다. 이 방법으로 ISEVEN을 정의한다 :

    def isEven = isDivisibleBy(2)
    

    그리고 이것은뿐만 아니라 방법으로 ISEVEN을 정의한다 :

    val isEven = isDivisibleBy(2)
    

    두 경우 ISEVEN가 호출되면 함수를 리턴하는 방법이다.

    첫 번째 경우에, (2)는 isDivisible ISEVEN가 호출 될 때마다 호출된다. 예를 들어,이 isDivisible (2) 세 번 호출

    def isEven = isDivisibleBy(2)
    List(1,2,3).filter(isEven)
    

    후자의 경우, (2) isDivisible 일단 호출 (건축시 또는 정의하는 선이 수행 될 때), 그 값이 ISEVEN가 호출 될 때마다 검색된다. 다음의 예는 isDivisible (2) 한 번 만 호출

    val isEven = isDivisibleBy(2)
    List(1,2,3).filter(isEven)
    
  3. ==============================

    3.나는 발로서 기능 ISEVEN를 정의하는 주요 프로 기능이 방법을 정의 할 수 있음을 관객들에게 보여주는 것입니다 생각합니다. 그런 다음 함수가 스칼라에서 다른 모든 것들처럼 단지 객체 즉, 분명하다. 그러나 비 시연 프로그래밍의 세계에서, 발스 같은 기능을 쓸 필요가 없습니다.

    나는 발로서 기능 ISEVEN를 정의하는 주요 프로 기능이 방법을 정의 할 수 있음을 관객들에게 보여주는 것입니다 생각합니다. 그런 다음 함수가 스칼라에서 다른 모든 것들처럼 단지 객체 즉, 분명하다. 그러나 비 시연 프로그래밍의 세계에서, 발스 같은 기능을 쓸 필요가 없습니다.

  4. ==============================

    4.방법 데프 isDivisibleBy (K : INT) : 지능은 => 부울 변수로서 지능 (I)을 취하고 부울 (I % K == 0) 돌려주는 함수를 반환한다.

    방법 데프 isDivisibleBy (K : INT) : 지능은 => 부울 변수로서 지능 (I)을 취하고 부울 (I % K == 0) 돌려주는 함수를 반환한다.

    한편 브로 ISEVEN = isDivisibleBy (2) isDivisibleBy (2)에 의해 반환 된 함수가 저장되는 필드이다. 당신이 데프 대신 발로 사용하는 경우 다음 isDivisibleBy 방법은 ISEVEN 메소드가 호출 될 때마다 호출 할 것이지만, 지금은 한 번만라고하고, 결과는 필드에 저장됩니다.

    (: 지능 I) : 현재 DEF ISEVEN를 작성하여 동일한 결과를 얻을 수있는 부울 = 1 % 2 == 0

    나는 예제의 포인트는 다른 기능을 반환하는 함수를 가질 수 있습니다, 당신은 객체로 기능을 저장하고 그들이 전통적으로 정의 된 방법 인 것처럼 그들을 호출 할 수 있다는 것입니다 생각합니다. (이 무두질에 대한 스칼라의 구문을 사용하지 않지만) 그 또한 예에 의해 입증 한 일이 될 수 있도록 위의 코드는, 또한 태닝와 매우 유사하다.

  5. from https://stackoverflow.com/questions/4839537/functions-vs-methods-in-scala by cc-by-sa and MIT license