[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.후드, 기능 및 방법 사이에 다른 차이가있다. 일반적으로 평범한 방법은 (기술적으로 적용되는 방법으로 목적) 함수보다 적은 오버 헤드를 생성.
후드, 기능 및 방법 사이에 다른 차이가있다. 일반적으로 평범한 방법은 (기술적으로 적용되는 방법으로 목적) 함수보다 적은 오버 헤드를 생성.
당신이 그 차이에 대해 걱정하지 않으려 고 서로 다른 의미와 필드와 데프, 발 및 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.여기 또 다른 점을 해결하고 싶습니다. 이 방법으로 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.나는 발로서 기능 ISEVEN를 정의하는 주요 프로 기능이 방법을 정의 할 수 있음을 관객들에게 보여주는 것입니다 생각합니다. 그런 다음 함수가 스칼라에서 다른 모든 것들처럼 단지 객체 즉, 분명하다. 그러나 비 시연 프로그래밍의 세계에서, 발스 같은 기능을 쓸 필요가 없습니다.
나는 발로서 기능 ISEVEN를 정의하는 주요 프로 기능이 방법을 정의 할 수 있음을 관객들에게 보여주는 것입니다 생각합니다. 그런 다음 함수가 스칼라에서 다른 모든 것들처럼 단지 객체 즉, 분명하다. 그러나 비 시연 프로그래밍의 세계에서, 발스 같은 기능을 쓸 필요가 없습니다.
-
==============================
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
나는 예제의 포인트는 다른 기능을 반환하는 함수를 가질 수 있습니다, 당신은 객체로 기능을 저장하고 그들이 전통적으로 정의 된 방법 인 것처럼 그들을 호출 할 수 있다는 것입니다 생각합니다. (이 무두질에 대한 스칼라의 구문을 사용하지 않지만) 그 또한 예에 의해 입증 한 일이 될 수 있도록 위의 코드는, 또한 태닝와 매우 유사하다.
from https://stackoverflow.com/questions/4839537/functions-vs-methods-in-scala by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 자바에서 구현 방법과 스칼라 특성을 사용하여 (0) | 2019.11.01 |
---|---|
[SCALA] 스칼라 : 객체 목록에서 중복 제거 (0) | 2019.11.01 |
[SCALA] 왜 스칼라에서 패턴 매칭이되지 변수와 함께 작동합니까? (0) | 2019.11.01 |
[SCALA] flatMap /지도 변환에 대한-이해와 혼란 (0) | 2019.11.01 |
[SCALA] 스칼라 웹 프레임 워크를 사용할 수 있습니까? [닫은] (0) | 2019.11.01 |