[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.당신이 정의에서 괄호를 포함하는 경우 당신이 메서드를 호출 할 때 선택적으로이를 생략 할 수 있습니다. 당신이 정의를 생략하면 당신이 메서드를 호출 할 때 당신이 그들을 사용할 수 없습니다.
당신이 정의에서 괄호를 포함하는 경우 당신이 메서드를 호출 할 때 선택적으로이를 생략 할 수 있습니다. 당신이 정의를 생략하면 당신이 메서드를 호출 할 때 당신이 그들을 사용할 수 없습니다.
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.제가 중복 된 질문에 게시 된 내 대답을 복사하자
제가 중복 된 질문에 게시 된 내 대답을 복사하자
0 인수에 대응 스칼라 방법 또는 괄호없이 정의 될 수있다 (). 이후 브로로서 구현 될 수없는 한, 반대로 이것은 (수 std 밖으로 프린트 아웃이나 데이터 파괴 등) 방법이 부작용의 일종되었음을 사용자에게 알리기 위해 사용된다.
스칼라에서 프로그래밍을 참조하십시오 :
-
==============================
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.나는 항상 추천하는 기능 등으로 정의를 시작합니다 :
나는 항상 추천하는 기능 등으로 정의를 시작합니다 :
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 통화 별 이름 매개 변수가 아닌 함수를 허용하도록 고차 함수를 정의하려고합니다. 당신이 강제되는 경우에만, 단이 경우 이전 옵션을 사용합니다.
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
'SCALA' 카테고리의 다른 글
[SCALA] 명명 된 인수에 밑줄 (0) | 2019.11.01 |
---|---|
[SCALA] 스파크 구조화 스트리밍이 자동으로 현지 시간으로 타임 스탬프로 변환 (0) | 2019.11.01 |
[SCALA] 어떻게 구조화 스트리밍을 사용 카프카에서 JSON 형식의 기록을 읽어? (0) | 2019.11.01 |
[SCALA] 스칼라 : mapValues이보기를 생산하고 안정적인 대안이 왜? (0) | 2019.11.01 |
[SCALA] 자바에서 구현 방법과 스칼라 특성을 사용하여 (0) | 2019.11.01 |