Pergunta

Qualquer idéia de como retornar múltiplas variáveis ?? a partir de uma função em ActionScript 3?

Qualquer coisa como VB.NET, onde você pode ter o variável do argumento de entrada modificado (ByRef argumentos)?

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

Tudo apart from retornar um array associativo ?

return {a:"string 1", b:"string 2"}
Foi útil?

Solução

Tudo em AS3 é uma referência para além de [u] ints. Para generalizar, tudo que herda Object será dada para a função por uma referência.

Dito isto, a única maneira que eu acredito que você pode fazer isso é usar uma classe de contêiner como um Array ou um String ( "5" e fazer a conversão + matemática).

Outras dicas

Citando uma fonte pesquisei:

No ActionScript 3.0, todos os argumentos são passados ??por referência porque todos os valores são armazenados como objetos. No entanto, objetos que pertencem aos tipos de dados primitivos, que inclui Boolean, Number, int, uint e String, têm operadores especiais que fazem com que se comportem como se fossem passados ??por valor.

O que me levou a procurar o canônica fonte .

Parece que Cordas, ints, unidades, Booleans são passados ??por valor. Eu tentei este pequeno trecho em Flash e os resultados foram negativos:

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

var b:String = "old";

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

Então ... é String um tipo de dado na lista negra também? Boolean também? Quero dizer o que é uma maneira de dizer que tipos são passados ??por referência?

É tudo por valor, se você entender de programação C, você estará familiarizado com o conceito de ponteiros.

Pense em um ponteiro como apontando para algo na memória, e todos os nomes de variáveis ??"bob a partir de (bob = new Person ();)". São essencialmente ponteiros que você trabalha com

Agora, quando você declarar uma função, uma vez que todos eles são por valor

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

Você pode pensar em "A" e "B", sendo novos ponteiros, portanto, apenas dentro da função "Test" fazer as duas coisas "a" e existe "b" e apontar para algo na memória.

Então, vamos usá-lo

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

Assim, os ponteiros S1 e S2 irá sempre apontar para "null" e "um novo Sprite na memória", respectivamente, a menos que sejam modificados como S1 e S2 dentro de sua "Scope" <- Por favor, certifique-se de compreender o escopo de variáveis ??antes mesmo de tentando lidar com isso.

E dentro da função agora temos duas novas ponteiros "um", apontando para "null" e "b", apontando para "o mesmo Sprite na memória como s2". Então, já que objetos e matrizes são essencialmente coleções de ponteiros e apenas dois novos ponteiros foram criados pela função para o uso "a" e "b" quaisquer propriedades / variáveis ??expostas "ponteiros para os dados na memória" de "a" ou "b" ainda será exatamente o mesmo que os de "S1" e "S2" e são exatamente o mesmo ponteiros.

Assim, dentro da função quando "a" fica definido para ser "b", realmente tudo o que acontece é o "um" ponteiro agora aponta para a mesma coisa que "b". Mas "S1" e "S2" ainda apontam para o que eles estavam apontando para antes.

!!!! Se este foi de referência que você não seria capaz de pensar em "a" e "b" como novos ponteiros, eles seriam realmente "S1" e "S2" a si mesmos, exceto que você escrevê-los como "a" e "b" .

Errado errado errado e errado .. cada argumento é passado por valor !!! o fato de que você pode alterar uma propriedade no interior do objeto passado não significa que você pode mudar o objeto em si. tente o seguinte código

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);
}

e aqui está o resultado de rastreio:

null
[object Sprite]

Observe a sutil diferença entre o exemplo de DarthZorG e este a partir dos documentos do Flash:

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

ponto é: Você não pode mudar o que a referência está apontando para, mas você pode alterar os dados que a referência está apontando, desde que essa referência é um objeto / Matriz.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top