2010-03-09 4 views
0

F #에서는 변수를 지정할 때 변수를 선언합니다. 나는 당신이 C의 방법으로 바르를 선언 할 수 있습니다 확신하지만 어떻게 내가 이상적으로이어떻게 이것을 F # 또는 다른 함수 언어로 작성합니까?

long id=0 
using (SQLiteDataReader r = command.ExecuteReader()) 
{ 
    while (r.Read()) 
    { 
     id = r.GetInt64(0); 
     //... 
     break; 
    } 
} 
//use id in sqlite now that it isnt locked 

답변

8

첫째, 당신이 어떤에서 모든 예에서 반복해야하는 경우 모르겠어요. 코드는 항상 첫 번째 행의 값을 반환합니다. 예제를 조금 복잡하게 만들고 특정 ID를 결과로 얻고 싶지 않을 수도 있다고 가정합니다 (따라서 루핑을해야 할 수도 있습니다).

함수 언어에서 루핑 구문을 작성하는 일반적인 방법은 재귀를 사용하는 것입니다. 많은 경우에 직접 사용할 수있는 유용한 고차 함수가 많이 있으므로 재귀를 명시 적으로 사용하지 않아도됩니다.

let id = 
    (use r = command.ExecuteReader() 
    let rec read() = 
     if r.Read() then 
     let id = r.GetInt64(0) 
     if weWantThisId id then id // this is the ID we want 
     else read()     // continue reading IDs 
     else 0      // default value/throw 
    read()) 

read 기능은 다음과 같습니다 그 다음은, 그 자체를 호출하지 않으면 반복적으로 다음 줄을 읽기 위해 ID 반환 성공하면 -이 경우, 간단한 재귀 함수 번 r.Read()를 호출 read을 쓸 수 있습니다 id 값을 초기화하는 범위에 로컬 함수로 작성됩니다. 즉, F #이 값을 id에 할당하면 ExecuteReader을 실행 한 다음 로컬 함수 read을 실행합니다 (초기화를 단일 표현식으로 작성하는 방법). 물론이 존이 시사하는 바와 같이 fetchId 함수를 작성하기 위해 더 많은 읽을 수 있습니다 (F #으로 다시 재귀를 사용합니다) :

let fetchId() = 
    use r = command.ExecuteReader() 
    let rec read() = 
    if r.Read() then 
     let id = r.GetInt64(0) 
     if weWantThisId id then id 
     else read() 
    else 0 
    read() 
+0

'r'을 (를) 삭제하는 방법은 무엇입니까? – Gabe

+0

두 번째 스 니펫에 한 행이 누락되어 혼란을 야기했을 수 있습니다. 어쨌든'use '를 사용하고 있으므로 범위를 벗어나는 경우 (첫 번째 예제에서 ID를 계산 한 후 또는 두 번째 예제에서 함수에서 반환 한 후)'r '이 자동으로 삭제됩니다. –

+0

완벽한, 첫 번째 예제는 내 질문에 대답했다. 사실 내 코드가 루프와 휴식을 가지고있는 이유는 거기에 if (cond)와 cond 문 (그 자체의 기능에서는 의미가없는)이 계속 존재하기 때문입니다. 나는 자신의 범위가있는 if 문에서 변수를 할당하는 기능을 좋아합니다. –

2

을 작성할 수 있습니다, 당신은 별도의 함수를 작성하고 그 함수에서 값을 반환 할 것입니다. 그래서 C#에서 :

long id = FetchId(); 

... 

int FetchId(...) 
{ 
    using (SQLiteDataReader r = command.ExecuteReader()) 
    { 
     if (r.Read()) 
     { 
      return r.GetInt64(0); 
     } 
    } 
    // Work out what you want to do if there were no results... 
    // Throw an exception? Change it to a nullable int and return null? 
} 
3

거친 번역 : 모든

let mutable id = 0L 
(
    use r = command.ExecuteReader() 
    let mutable finished = false 
    while not(finished) do 
     if r.Read() then 
      id <- r.GetInt64(0) 
      // ... 
      finished <- true 
     else 
      finished <- true 
) 
// ... 
+0

는 F 번호의 모든 기능 언어로 제공하지만, 사용할 수없는 실제 변경 가능한 변수를 (사용), 질문에 가장 문자 그대로 정확한 답이 물었다. – peSHIr

관련 문제