Qual é a maneira mais limpa de simular passagem por referência no Actionscript 3.0?

StackOverflow https://stackoverflow.com/questions/49107

  •  09-06-2019
  •  | 
  •  

Pergunta

Actionscript 3.0 (e presumo que Javascript e ECMAScript em geral) não possuem passagem por referência para tipos nativos como ints.Como resultado, estou achando muito complicado recuperar valores de uma função.Qual é o padrão normal para contornar isso?

Por exemplo, existe uma maneira limpa de implementar trocar(intA, intB) em Actionscript?

Foi útil?

Solução

Acredito que o melhor que você pode fazer é passar um objeto contêiner como argumento para uma função e alterar os valores de algumas propriedades desse objeto:

function swapAB(aValuesContainer:Object):void
{
    if (!(aValuesContainer.hasOwnProperty("a") && aValuesContainer.hasOwnProperty("b")))
        throw new ArgumentError("aValuesContainer must have properties a and b");

    var tempValue:int = aValuesContainer["a"];
    aValuesContainer["a"] = aValuesContainer["b"];
    aValuesContainer["b"] = tempValue;
}
var ints:Object = {a:13, b:25};
swapAB(ints);

Outras dicas

Suponho que uma alternativa seria definir esse tipo de coisa em algum lugar ...

public class Reference {
    public var value:*;
}

Em seguida, use funções que recebam alguns argumentos de referência para atuar como "ponteiros" se você estiver apenas procurando por parâmetros "out" e inicializá-los no caminho de entrada ou não e sua troca se tornaria:

function swap(Reference a, Reference b) {
    var tmp:* = a.value;
    a.value = b.value;
    b.value = tmp;
}

E você sempre pode enlouquecer e definir IntReference, StringReference, etc.

Isso é picuinhas, mas int, String, Number e os outros são passados ​​​​por referência, só que são imutáveis.Claro, o efeito é o mesmo de se fossem passados ​​por valor.

Você também pode usar um wrapper em vez de int:

public class Integer
{
    public var value:int;

    public function Integer(value:int)
    {
        this.value = value;
    }
}

Claro, isso seria mais útil se você pudesse usar a sobrecarga do operador...

Basta olhar para algum código Java.Java tem a convenção de que os tipos de referência são passados ​​por referência e os tipos primitivos são passados ​​por valor desde seu início.É um modelo muito bom em muitos aspectos.

Mas falando em swap, a melhor e mais fácil maneira de fazer uma troca em Java/AS3 é com as três linhas a seguir:

var temp:int = array[i];
array[j] = array[i];
array[i] = temp;

Não há realmente nenhuma razão para usar uma função para fazer uma troca simples, quando você pode fazer isso mais rápido com apenas 3 linhas.

É irritante.Mas se você usar expressões idiomáticas diferentes das de, por ex.C#, você pode obter resultados de qualidade razoável.Se você precisar passar muitos parâmetros de um lado para outro, passe um objeto preenchido com os dados necessários e altere os parâmetros do objeto quando retornar.A classe Object serve exatamente para esse tipo de coisa.

Se você só precisa retornar um monte de dados, retorne um Objeto.Isso está mais de acordo com o estilo ECMAScript do que com a semântica de passagem por referência.

Atribuição de desestruturação (por ex.[a,b] = [b,a]) não está definido na especificação ECMA-262 3 e não está implementado em JavaScript 1.5, que é a versão equivalente à implementação de JScript no IE.Eu vi essa sintaxe na visualização das especificações AS4 e acredito que faça parte do JavaScript 1.7.

Se o ActionScript funcionar como Javascript,

[a,b] = [b,a]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top