byref, ref 및 & 이해
-
14-11-2019 - |
문제
글쎄요, 저는 F#이 참조(참조와 같은 일종의 C++)를 관리할 수 있다는 것을 이해하게 되었습니다.이를 통해 함수에 전달된 매개변수의 값을 변경할 수 있으며 프로그래머가 단일 값 이상을 반환할 수도 있습니다.그러나 내가 알아야 할 사항은 다음과 같습니다.
참조 키워드:키워드
ref
값에서 유추된 유형의 해당 값에 대한 참조를 생성하는 데 사용됩니다.그래서let myref = ref 10
이는 F#이 다음 유형의 개체를 생성한다는 의미입니다.
Ref<int>
거기에 (변경 가능한 필드에) 내int 10
.좋아요.그래서 나는
ref
의 인스턴스를 생성하는 데 사용됩니다.Ref<'a>
유형.맞습니까?액세스 값:참조에 저장된 값에 액세스하려면 다음을 수행할 수 있습니다.
let myref = ref 10 let myval = myref.Value let myval2 = !myref
동안
:=
연산자를 사용하면 다음과 같이 값을 편집할 수 있습니다.let myref = ref 10 myref.Value <- 30 myref := 40
그래서
!
(뱅) 내 참조를 역참조합니다.그리고:=
편집하세요.이것도 맞는 것 같아요.& 연산자:이 연산자는 무엇을 합니까?참조 유형에 적용됩니까?아니요, 변경 가능한 값에 적용되어야 하며 이는 무엇을 반환합니까?참조?주소?대화형을 사용하는 경우:
let mutable mutvar = 10;; &a;;
마지막 줄에 오류가 발생하여 무엇을 이해하지 못합니까?
&
연산자는 다음과 같습니다.참조 기준:는 어때
byref
?그것은 나에게 매우 중요하지만 나는 그것을 이해하지 못한다는 것을 깨달았습니다.매개변수 전달과 관련된 함수에서 사용되는 것으로 알고 있습니다.전달된 값을 편집할 수 있기를 원할 때 byref를 사용합니다(이것은 함수형 언어의 철학에 약간 어긋나지만 f#은 그 이상입니다).다음을 고려하세요:let myfunc (x: int byref) = x <- x + 10
이건 이상해.알고보니 참고자료가 있으면
let myref = ref 10
그런 다음 값을 편집하려면 다음을 수행하십시오.myref <- 10
다음과 같아야 하기 때문에 오류가 발생합니다.myref := 10
.하지만 해당 기능에서 편집이 가능하다는 사실은x
사용하여<-
연산자는 다음을 의미합니다.x
참고가 아니죠?내가 그렇다고 가정하면
x
참조가 아닌 경우 함수에서 다음을 사용할 때 가정합니다.byref
매개변수에서 해당 매개변수에는 변경 가능한 구문이 적용될 수 있습니다.따라서 이것은 구문의 문제일 뿐입니다. 이것이 괜찮다고 가정하면 실제로 모든 것이 작동합니다(컴파일러 오류 없음).그러나 무엇입니까?x
?호출 기능: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
필드는 유용한 시나리오이기 때문에...).