문제

글쎄요, 저는 F#이 참조(참조와 같은 일종의 C++)를 관리할 수 있다는 것을 이해하게 되었습니다.이를 통해 함수에 전달된 매개변수의 값을 변경할 수 있으며 프로그래머가 단일 값 이상을 반환할 수도 있습니다.그러나 내가 알아야 할 사항은 다음과 같습니다.

  1. 참조 키워드:키워드 ref 값에서 유추된 유형의 해당 값에 대한 참조를 생성하는 데 사용됩니다.그래서

    let myref = ref 10
    

    이는 F#이 다음 유형의 개체를 생성한다는 의미입니다. Ref<int> 거기에 (변경 가능한 필드에) 내 int 10.

    좋아요.그래서 나는 ref 의 인스턴스를 생성하는 데 사용됩니다. Ref<'a> 유형.맞습니까?

  2. 액세스 값:참조에 저장된 값에 액세스하려면 다음을 수행할 수 있습니다.

    let myref = ref 10
    let myval = myref.Value
    let myval2 = !myref
    

    동안 := 연산자를 사용하면 다음과 같이 값을 편집할 수 있습니다.

    let myref = ref 10
    myref.Value <- 30
    myref := 40
    

    그래서 ! (뱅) 내 참조를 역참조합니다.그리고 := 편집하세요.이것도 맞는 것 같아요.

  3. & 연산자:이 연산자는 무엇을 합니까?참조 유형에 적용됩니까?아니요, 변경 가능한 값에 적용되어야 하며 이는 무엇을 반환합니까?참조?주소?대화형을 사용하는 경우:

    let mutable mutvar = 10;;
    &a;;
    

    마지막 줄에 오류가 발생하여 무엇을 이해하지 못합니까? & 연산자는 다음과 같습니다.

  4. 참조 기준:는 어때 byref?그것은 나에게 매우 중요하지만 나는 그것을 이해하지 못한다는 것을 깨달았습니다.매개변수 전달과 관련된 함수에서 사용되는 것으로 알고 있습니다.전달된 값을 편집할 수 있기를 원할 때 byref를 사용합니다(이것은 함수형 언어의 철학에 약간 어긋나지만 f#은 그 이상입니다).다음을 고려하세요:

    let myfunc (x: int byref) =
        x <- x + 10
    

    이건 이상해.알고보니 참고자료가 있으면 let myref = ref 10 그런 다음 값을 편집하려면 다음을 수행하십시오. myref <- 10 다음과 같아야 하기 때문에 오류가 발생합니다. myref := 10.하지만 해당 기능에서 편집이 가능하다는 사실은 x 사용하여 <- 연산자는 다음을 의미합니다. x 참고가 아니죠?

    내가 그렇다고 가정하면 x 참조가 아닌 경우 함수에서 다음을 사용할 때 가정합니다. byref 매개변수에서 해당 매개변수에는 변경 가능한 구문이 적용될 수 있습니다.따라서 이것은 구문의 문제일 뿐입니다. 이것이 괜찮다고 가정하면 실제로 모든 것이 작동합니다(컴파일러 오류 없음).그러나 무엇입니까? x?

  5. 호출 기능:byref 매개변수를 활용하는 함수를 어떻게 사용할 수 있나요?

    그만큼 & 교환원이 관련되어 있는데 이에 대해 더 잘 설명해 주실 수 있나요?이 기사에서는: MSDN 매개변수 및 인수 다음 예가 제공됩니다.

    type Incrementor(z) =
        member this.Increment(i : int byref) =
           i <- i + z
    
    let incrementor = new Incrementor(1)
    let mutable x = 10
    // A: Not recommended: Does not actually increment the variable. (Me: why?)
    incrementor.Increment(ref x)
    // Prints 10.
    printfn "%d" x  
    
    let mutable y = 10
    incrementor.Increment(&y) (* Me: & what does it return? *)
    // Prints 11.
    printfn "%d" y 
    
    let refInt = ref 10
    incrementor.Increment(refInt) (* Why does it not work in A, but here it does? *)
    // Prints 11.
    printfn "%d" !refInt
    
도움이 되었습니까?

해결책

참조 키워드 응, 쓸 때 let a = ref 10 당신은 본질적으로 글을 쓰고 있습니다 let a = new Ref<int>(10) 어디에 Ref<T> 유형에 변경 가능한 필드가 있습니다. Value.

액세스 가치 그만큼 := 그리고 ! 연산자는 작성의 지름길일 뿐입니다:

a.Value <- 10  // same as writing: a := 10
a.Value        // same as writing: !a

ByRef 메소드 매개변수에서만 (합리적으로) 사용할 수 있는 특수 유형입니다.이는 인수가 본질적으로 일부 메모리 위치(힙 또는 스택에 할당됨)에 대한 포인터여야 함을 의미합니다.에 해당합니다 out 그리고 ref C#의 수정자.이 유형의 지역 변수는 생성할 수 없습니다.

& 연산자 함수/메소드에 인수로 전달될 수 있는 값(포인터)을 생성하는 방법입니다. byref 유형.

함수 호출 의 예 byref 메소드에 변경 가능한 로컬 변수에 대한 참조를 전달하기 때문에 작동합니다.참조를 통해 메소드는 해당 변수에 저장된 값을 변경할 수 있습니다.

다음은 작동하지 않습니다.

let a = 10            // Note: You don't even need 'mutable' here
bar.Increment(ref a)  

그 이유는 새로운 인스턴스를 생성하고 있기 때문입니다. Ref<int> 그리고 당신은 a 이 경우에.그만큼 Increment 그런 다음 메소드는 인스턴스의 힙에 저장된 값을 수정합니다. Ref<int>, 하지만 더 이상 이 개체에 대한 참조가 없습니다.

let a = ref 10
bar.Increment(a)  

이것이 효과가 있는 이유는 a 유형의 값입니다. Ref<int> 그리고 힙 할당 인스턴스에 대한 포인터를 전달합니다. Increment 그런 다음 다음을 사용하여 힙 할당 참조 셀에서 값을 가져옵니다. !a.

(다음을 사용하여 생성된 값을 사용할 수 있습니다. ref 에 대한 주장으로 byref 컴파일러는 이 경우를 특별히 처리하기 때문에 자동으로 참조를 취합니다. Value 필드는 유용한 시나리오이기 때문에...).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top