2017-02-19 5 views
0

메서드 서명이 아래에있는 "counter"라는 메서드를 구현하려고하는 스칼라 새내기.스칼라 : 반환 된 메서드 내에서 count 변수의 개별 상태

메서드는 상태가없는 함수 여야하므로 정수 n을 사용하여 호출 할 때 상태 저장 함수를 반환합니다. 이 상태 저장 함수는 처음 호출 될 때 n을 반환하고 n + 1, n + 2 등을 반환해야합니다.

실행중인 카운터 (1)가 두 개 함수를 두 번 생성하도록 카운터가 독립적이어야합니다. 다른 주.

val counter : Int =>() => Int = { 
    // Complete definition below. 
    var count = 0 

    n: Int =>() => { 
     var returnVal = n + count 
     count = count + 1 
     returnVal 
    } 
} 

카운터를 호출하는 방법의 예 : 아래

는 내가 지금까지 무엇을 가지고

assert ({ 
    val k1 :() => Int = counter (1) 
    val k2 :() => Int = counter (2) 
    val r1 : Int = k1() 
    val r2 : Int = k1() 
    val r3 : Int = k2() 
    val r4 : Int = k2() 
    val r5 : Int = k2() 
    val r6 : Int = k1() 
    (r1, r2, r3, r4, r5, r6) 
    } === (1, 2, 2, 3, 4, 3) 
) 

어설 션을 실행, 카운터 반환 (1, 2, 4의 내 구현 , 5, 6, 6).

나는 이것이 동일한 카운트 변수를 가리키는 k1과 k2로 인한 것이라고 생각합니다. 그러나 k1과 k2가 각각의 count 변수를 제공하여 요구 사항에 따라 "서로의 상태를 간섭하지 않도록"어떻게 제공하는지 알 수 없습니다.

올바른 경로에 있습니까? 모든 지침을 가장 높이 평가할 것입니다. 당신이를 정의 할 때 한 번 일어나는 변수 만 정의,

def counter : Int =>() => Int = { 
    // Complete definition below. 
    var count = 0 

    n: Int =>() => { 
     var returnVal = n + count 
     count = count + 1 
     returnVal 
    } 
} 

때문에 val과 :

답변

2

먼저 the difference between def and val 체크 아웃 :


그것은 당신이 var count = 0 라인 이후에 println를 추가 할 경우이 참조하는 것이 더 쉽습니다. TL; 그것의 DR은 val은 한 번만 평가할 것이므로 반환하려는 함수에 도달하기 전에 counter에 정의하면 실제로 카운트 보유 변수에 의존 할 수 없습니다.

더 명확하게하기 위해 패턴 일치가보다 명확하게 보이도록 괄호를 추가하고 전달 된 매개 변수를 counter으로 캡처하여 익명 함수에 대한 클로저에 저장해야하므로이 행을 분리했습니다. 돌아 오는 중.

val counter : Int =>() => Int = { 
    (n: Int) => { 
    var count = n 

    () => { 
     val returnVal = count 
     count = count + 1 
     returnVal 
    } 
    } 
} 
+0

이것은 완벽하게 작동했습니다. 고맙습니다! – shoogazer

+3

여기서는별로 중요하지 않지만'returnVal'을'val'로 만들 것입니다. –

+0

좋은 전화 @ Jasper-M. – bergren2

1

당신은 당신이 정의하는 카운터 방법에 대한 defval에서 키워드를 변경해야 카운터 메서드이므로 나중에 모든 클로저에서이 변수를 공유합니다. def 메서드를 사용하는 경우 카운트 변수는 카운터 (n)을 호출 할 때마다 재정의됩니다. ,

scala> val counter : Int =>() => Int = { 
      // Complete definition below. 
      var count = 0 
      println(count) 

      n: Int =>() => { 
       var returnVal = n + count 
       count = count + 1 
       returnVal 
      } 
     } 

0           // 0 is printed here 
counter: Int => (() => Int) = <function1> 

scala> val k1 = counter(1)     // nothing prints here 
k1:() => Int = <function0> 

scala> val k2 = counter(2)     // nothing prints here 
k2:() => Int = <function0> 
+0

감사합니다. 불행히도, 과제의 지침에 따라 val 키워드를 보관해야합니다. – shoogazer