2008-09-09 12 views
15

Una de las cosas que más extraño en ActionScript es la falta de sobrecarga del operador, en particular ==. Para evitar este problema, agregué un método de "Comparar" a mis clases, pero eso no ayuda en muchos casos, como cuando desea usar cosas como el diccionario incorporado.Falta de sobrecarga del operador en ActionScript 3.0

¿Hay una buena manera de evitar este problema?

Respuesta

12

Nope.

Pero no está de más agregar los métodos equals a sus propias clases. Intento nunca usar == al comparar objetos (lo mismo vale para ===, que es lo mismo para los objetos) ya que solo comprueba identidad.

Lamentablemente, todas las colecciones en Flash y Flex asumen que la identidad es la única medida de igualdad que se necesita.

hay indicios de Flex que alguien quería aliviar este problema en algún momento, pero parece como si hubiera sido abandonado: existe una interfaz llamada IUID, y se menciona en la Guía de Flex desarrollador, pero es no usado en ningún lado Ni siquiera las colecciones de Flex lo usan para determinar la igualdad. Y dado que está pidiendo una solución para Flash, puede que no le haya ayudado de todos modos.

He escrito algo más sobre esto (en el contexto de Flex) en mi blog: Is there no equality?.

+0

Esto no es un problema. Las colecciones de bajo nivel deben usar igualdad de instancias. Cualquier otro tipo de verificación de igualdad es completamente arbitrario y debe estar bien definido en un método de igualdad. Debería ser muy obvio si desea igualdad de instancias o alguna verificación arbitraria de igualdad de datos cuando está codificando algo. En general, el único momento en el que desearía verificaciones de igualdad de datos (verificaciones de una clave de objeto particular) es cuando se trata de objetos de datos remotos o registros de bases de datos que son identificables por una clave en particular. No hay implementación genérica en las colecciones, porque es trivial de implementar. – Triynko

+0

Acabo de crear una colección de métodos auxiliares en una clase DataUtils con una firma de método como 'indexOfValue (collection: *, value: *, match_field_or_function: *): int;' El método simplemente puede iterar sobre la colección y extraer un particular campo de cada objeto para comparar con * valor *, o puede ejecutar cada objeto a través de una función cuyo resultado se compara con * valor *. El parámetro * match_field_or_function * incluso maneja nombres de campos de varias partes para profundizar, como "data.id" en una colección de elementos de lista que tienen cada uno una propiedad de datos que contiene cualquier clase de objeto con un campo de id. – Triynko

4

Sí se puede hacer (pero tenga cuidado, su hacky): http://filimanjaro.com/2012/operators-overloading-in-as3-javascript-too-%E2%80%93-workaround/

En el tutorial que escribí sobre + =, - = sobrecarga de operadores. Pero también es posible con ==, puedo escribir más sobre eso si no está claro.

Ah, el enfoque tiene algún inconveniente (en casos raros puede ser incluso peligroso). Piense dos veces, antes de usarlo en una producción.

EDIT:

Después de las pruebas parece que el truco con + =, - = no se aplica al operador == (lo que tiene sentido). Lo siento por información engañosa.

+1

Esto es totalmente loco. Es realmente raro, pero es una de las mejores cosas que he visto en AS3. – thedayturns