문제

방법에 대한 아이디어가 있습니까? 여러 변수를 반환 ActionScript 3의 함수에서?

VB.NET과 같은 모든 것 입력 인수의 변수 수정되었습니까(ByRef 인수)?

Sub do (ByRef inout As Integer)
 inout *= 5;
End Sub

Dim num As Integer = 10
Debug.WriteLine (num)        '10
do (num)
Debug.WriteLine (num)        '50

아무것 와는 별개로 반환 연관 배열?

return {a:"string 1", b:"string 2"}
도움이 되었습니까?

해결책

AS3의 모든 것은 [u] int를 제외하고 참조입니다. 상속하는 모든 것을 일반화하기 위해 Object 참조로 기능에 제공됩니다.

즉, 내가 할 수 있다고 믿는 유일한 방법은 컨테이너 클래스를 사용하는 것입니다. Array 또는 a String ( "5"및 변환+수학을 수행).

다른 팁

Googled 소스 인용 :

ActionScript 3.0에서는 모든 값이 객체로 저장되므로 모든 인수는 참조로 전달됩니다. 그러나 부울, 숫자, int, uint 및 string을 포함하는 원시 데이터 유형에 속하는 객체는 마치 가치를 통과 한 것처럼 행동하게하는 특수 연산자가 있습니다.

그로 인해 나를 찾아 보았습니다 표준 출처.

그것은 보인다 문자열, int, 단위, 부울은 가치에 따라 통과됩니다.이 작은 스 니펫을 플래시로 시도했는데 결과는 부정적이었습니다.

function func(a:String){
    a="newVal";
}

var b:String = "old";

trace(b)    //  old
func(b);
trace(b)    //  old

그래서 ... 문자열도 블랙리스트 데이터 유형입니까? 부울도? 내말은 확실히 말하는 방법은 무엇입니까? 어떤 유형이 참조로 전달됩니까?

그것은 모두 가치에 의한 것입니다. C 프로그래밍을 이해한다면 포인터의 개념에 익숙할 것입니다.

포인터가 메모리의 무언가를 가리키는 것으로 생각하면 모든 변수 이름 "bob from (bob = new person();)"은 기본적으로 작업에 사용되는 포인터입니다.

이제 함수를 선언하면 모두 By Value이므로

function Test(a:Object, b:Object):void {
   a = b;
}

"a"와 "b"는 모두 새로운 포인터라고 생각할 수 있으므로 "Test" 함수 내에서만 "a"와 "b"가 모두 존재하고 메모리의 무언가를 가리킵니다.

그럼 활용해보자

var s1:Sprite = null;
var s2:Sprite = new Sprite;
Test(s1,s2);

따라서 s1 및 s2 포인터는 "범위" 내에서 s1 및 s2로 수정되지 않는 한 항상 각각 "null" 및 "메모리의 새 Sprite"를 가리킵니다. <- 처리하기 전에 변수 범위를 이해했는지 확인하십시오. 이것.

그리고 함수 내에는 이제 "null"을 가리키는 두 개의 새로운 포인터 "a"와 "s2와 메모리에 있는 동일한 스프라이트"를 가리키는 "b"가 있습니다.따라서 개체와 배열은 본질적으로 포인터 모음이고 "a" 및 "b"를 사용하기 위해 함수에 의해 두 개의 새 포인터만 생성되었으므로 "a" 또는 "b"의 모든 속성/노출된 변수 "메모리의 데이터에 대한 포인터" "s1" 및 "s2"에 대한 것과 여전히 동일하며 동일한 포인터입니다.

따라서 함수 내에서 "a"가 "b"로 설정되면 실제로 일어나는 모든 일은 이제 "a" 포인터가 "b"와 동일한 것을 가리키는 것입니다.그러나 "s1"과 "s2"는 여전히 이전에 가리키고 있던 것을 가리키고 있습니다.

!!!!이것이 참조에 의한 것이라면 "a"와 "b"를 새로운 포인터로 생각할 수 없을 것입니다. "a"와 "b"로 쓰는 것을 제외하면 실제로는 "s1"과 "s2" 그 자체일 것입니다. .

잘못된 잘못과 잘못 .. 모든 논쟁은 가치에 의해 전달됩니다 !!! 통과 된 객체 내부의 속성을 변경할 수 있다는 사실이 객체 자체를 변경할 수 있다는 의미는 아닙니다. 다음 코드를 시도하십시오

function Test(a:Object, b:Object):void {
   a = b;
}

function Test2():void {
   var s1:Sprite = null;
   var s2:Sprite = new Sprite;

   Test(s1,s2);
   Trace(s1);
   Trace(s2);
}

그리고 여기에 흔적 결과가 있습니다.

null
[object Sprite]

Darthzorg의 예와 플래시 문서의 예제의 미묘한 차이점에 주목하십시오.

function passByRef(objParam:Object):void 
{ 
    objParam.x++; 
    objParam.y++; 
    trace(objParam.x, objParam.y); 
} 
var objVar:Object = {x:10, y:15}; 
trace(objVar.x, objVar.y); // 10 15 
passByRef(objVar); // 11 16 
trace(objVar.x, objVar.y); // 11 16

지점은 :참조가 가리키는 것을 변경할 수는 없지만 참조가 객체/배열 인 한 참조가 가리키는 데이터를 변경할 수 있습니다.

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