Scala에서의 9가지 함수 정의
def f1(n:Int) = println(n) def f2 = (n:Int) => println(n)오랫만에 scalafx를 만져보다 위의 차이점에 대해 궁금하게 되었다. 결론부터 이야기하자면 f1은 하나의 정수 인자를 받아 출력하는 함수이며 f2는 하나의 정수인자를 받아 출력하는 함수를 반환하는 함수이다. f1의 type은 Int=>Unit이며 f2는 ()=>(Int=>Unit)이 되는 셈이다.
StackOverflow에는 Scala에서 함수를 정의하는 9가지 방법이라는 질문이 나와있다.
def f1 = 10 def f2 {10} def f3 = {10} def f4() = 10 def f5() {10} def f6() = {10} def f7 = () => 10 def f8 = () => {10} def f9 = {() => {10}}가장 좋은 평가를 받은 답을 간단히 요약하면 =을 사용하지 않은 함수 def는 Unit을 반환하게 되므로 f1과 f5는 같은 함수이고 f2, f3, f4, f6는 아무런 인자를 가지지 않고 정수값을 반환하는 동일한 함수들이며 f7, f8, f9는 아무런 인자를 가지지 않고 정수값을 반환하는 함수를 반환하는 동일한 함수들이 된다.
scalafx에서 이벤트 핸들러는 다음과 같이 실행하는데 keyHandler2를 keyHandler1과 같이 사용하지 못하는 이유를 찾아보다 알게 되었다. keyHandler2를 쓰려면 keyHandler2를 반환하는 handler2Wrapper와 같은 함수를 이용해야 한다.
scene = new Scene { onKeyPressed = keyHandler1 } def keyHandler1 = (e:KeyEvent) => println(e.code) def keyHandler2(e:KeyEvent) = println(e.code) def handler2Wrapper:KeyEvent=>Unit = keyHandler2
댓글