Dead Code Preservation :: Archived AS3 works from wonderfl.net

Vector.sort()がダメすぎる件

ベクターのソートメソッドは、実装かマニュアルがおかしい。
たぶん内部でNumberをintに通してしまうミスをやってる。
adobeの人も間違うんだったら、いっそのことintにNumberを暗黙的に入れたらエラーってことにしたらいいのに
Get Adobe Flash player
by tail_y 25 Apr 2011

    Talk

    9re at 25 Apr 2011 19:40
    Arrayも同様のようです tamarinでも http://hg.mozilla.org/tamarin-central/file/b0ee91f30435/core/ArrayClass.cpp#l957 971行目で ActionScriptの関数の呼び出し結果を toInteger()で整数に型変換しています function (a:int, b:int):int { return x > y ? 1 : (x < y ? -1 : 0); } とするのが良さそうです。
    9re at 25 Apr 2011 19:46
    ECMA-262の仕様とは異なりますね 15.4.4.11 Array.prototype.sort (comparefn)には If comparefn is not undefined, it should be a function that accepts two arguments x and y and returns a negative value if x < y, zero if x = y, or a positive value if x > y. とあり、comparefnは整数を返すとは書いていない。 なので、バグ・・・なのか?
    yonatan at 25 Apr 2011 22:45
    https://bugzilla.mozilla.org/show_bug.cgi?id=532454 Explains some z-sorting problems I had with small scale models.

    Tags

    Embed
/**
 * Copyright tail_y ( http://wonderfl.net/user/tail_y )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/6OQk
 */

package {
	import flash.text.TextField;
	import flash.display.Sprite;

	/**
	 * 
	 * ベクターのソートメソッドは、実装かマニュアルがおかしい。
	 * たぶん内部でNumberをintに通してしまうミスをやってる。
	 * adobeの人も間違うんだったら、いっそのことintにNumberを暗黙的に入れたらエラーってことにしたらいいのに
	 * 
	 * @author sipo
	 */
	public class VectorSortTest extends Sprite {
		
		private var _displayString:String;
		
		
		public function VectorSortTest() {
			_displayString = "※理想(リファレンスより)" + "\n" +
			"指定したメソッドはベクターのベース型(T)の 2 つの引数を受け取り、数値を返す必要があります。" + "\n" +
			"  function compare(x:T, y:T):Number {}" + "\n" +
			"compareFunction 関数のロジックにより、2 つのエレメント x と y が指定された場合、この関数は次の 3 つの値のいずれかを返します。" + "\n" +
			"" + "\n" +
			"x が y の前に表示されるソート順の場合は負の数。" + "\n" +
			"x と y が等しい場合は 0。" + "\n" +
			"x が y の後に表示されるソート順の場合は正の数。" + "\n" +
			"--------" + "\n" +
			"※現実" + "\n";
			
			var vector:Vector.<Number> = Vector.<Number>([1.5, 2.1, 0.9, 0.5, 1.1, 0.1, 1.8]);
			
			_displayString += "[" + vector.join(", ") + "]" + "\n" + 
			"↓" + "\n";
			
			vector.sort(function (x:Number, y:Number):Number{
				return x - y;	// x < y ? -1 : 1にしたらうまくいく 
			});
			
			_displayString += "vector.sort(function (x:Number, y:Number):Number{" + "\n" + 
			"    return x - y;" + "\n" + 
			"});" + "\n" + 
			"↓" + "\n" + 
			"[" + vector.join(", ") + "]" + "\n" + 
			"何この中途半端なソート" + "\n";
			
			
			var tf:TextField = new TextField();
			addChild(tf);
			tf.width = 465;
			tf.height = 465;
			tf.text = _displayString;
			tf.wordWrap = true;
		}
	}
}