문제

여기서는 함수 내부에서 전역 변수의 값을 설정하려고 시도했지만 값이 변경되지 않았습니다.

setGlobalScope: func [theVar1] [
    theVar1: 10
]

theVar: 1

setGlobalScope theVar

print theVar
"This prints 1 instead of 10. The value of theVar has not changed."

함수 자체 내부에서 함수 매개변수 값을 수정하여 값이 함수 범위 대신 전역 범위 내에서 수정되도록 하는 것이 가능합니까?

도움이 되었습니까?

해결책

단어가 아닌 정수 값을 전달했습니다.함수 내에서 theVar1이라는 단어에는 해당 정수 값이 할당됩니다.정수, 날짜, 십진수와 같은 값은 내부적으로 "포인터"가 아니기 때문에 다시 할당해도 변경되지 않습니다.

따라서 단어 자체를 얻는 다양한 방법으로 이 문제를 해결할 수 있는 @sqlab의 답변입니다.차이점은 다음과 같습니다. function ['x] [code] 그리고 function [:x] [code] 여담으로 당신이 관심을 가질 수도 있습니다 ...

Rebol 3가 괄호 안에 인용된 함수 매개변수를 존중하지 않는 이유는 무엇입니까?

그러나 Rebol의 계열 값에는 대상에 영향을 미치는 수정 기능이 있습니다.단어가 가리키는 위치를 다시 할당하는 것뿐입니다.고려하다:

setGlobalScope: func [theVar1 [string!]] [
    clear theVar1
    insert theVar1 "Modification"
]

theVar: "Original"

setGlobalScope theVar

print theVar

그 인쇄 Modification.

합격해야 하는 경우 비계열 값 참고로 이를 시리즈로 배치하고 할당 대신 시리즈 수정 작업을 사용해야 합니다.할당은 블록 등에 대한 "포인터"를 덮어쓰게 되기 때문입니다.최악의 경우에는 필요한 경우 블록에 단일 값을 래핑할 수 있습니다.그러나 Rebol에는 덜 멋진 다른 언어에서 복제하려고 했던 것보다 더 나은 인터페이스를 만드는 데 방언이 도움이 되는 "잠깐, 이렇게 보세요..."가 많이 있습니다.:-)

참조 전달의 복잡성을 완화하는 것은 여러 반환 결과를 처리하는 Rebol의 단순성입니다.

foo: function [value1 value2] [
    return reduce [
        value1 + 7
        value2 + 16
    ]
]

set [a b] foo 03 04

print a
print b

그 출력 10 그리고 20.

다른 팁

조명 된 단어와 Get-Word의 조합을 사용하여 둘 이상의 방법이 있습니다.

e.g

>> setGlobalScope: func ['theVar1] [set :theVar1 10]
>> theVar: 1
== 1

>> 
>> setGlobalScope theVar
== 10

>> 
>> print theVar
10
.

>> setGlobalScope: func [theVar1] [set :theVar1 10]
>> theVar: 1
== 1

>> setGlobalScope 'theVar
== 10

>> print theVar
10
.

SetGlobalsCope Funct에서 변수 Thevar를 직접 수정할 수 있습니다.

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