2016-07-06 4 views
3

プログラムをC++からtypescriptに翻訳しています。配列を空にするスプライス技法(How do I empty an array in JavaScript?)を使用して配列を空にしようとしました。ここで スプライスを使用してChromiumで配列を空にする

"use strict" 
 

 
class UniformGridGeometry<ItemT> extends Array<ItemT> { 
 

 
    itemType: { new(): ItemT; } 
 

 
    constructor(itemType: { new(): ItemT; }) { 
 
     // constructor(itemType: { new(): ItemT; }, uGeomTemplate: UniformGridGeometry<any>) // any : Vorton, Particle, Vec*, Mat*, ... 
 
     // constructor(itemType: { new(): ItemT; }, uNumElements: number, vMin: Vec3, vMax: Vec3, bPowerOf2: boolean) 
 
     // constructor(itemType: { new(): ItemT; }, arg?: any, vMin?: Vec3, vMax?: Vec3, bPowerOf2?: boolean) { 
 

 
     super(); // Array 
 

 
     this.itemType = itemType; 
 

 
     // (...) 
 
    } 
 
} 
 

 

 
class UniformGrid<ItemT> extends UniformGridGeometry<ItemT> { 
 

 
    constructor(itemType: { new(): ItemT; }) { 
 
     // constructor(itemType: { new(): ItemT; }, uGeomTemplate: UniformGridGeometry<any>) // any : Vorton, Particle, Vec*, Mat*, ... 
 
     // constructor(itemType: { new(): ItemT; }, uNumElements: number, vMin: Vec3, vMax: Vec3, bPowerOf2: boolean) 
 
     // constructor(itemType: { new(): ItemT; }, arg?: any, vMin?: Vec3, vMax?: Vec3, bPowerOf2?: boolean) { 
 

 
     super(itemType); 
 

 
     // (...) 
 

 
    } 
 
} 
 

 
class NestedGrid<ItemT> extends Array<UniformGrid<ItemT>> { 
 

 
    constructor(src?: UniformGrid<ItemT>) { 
 
     super(); 
 

 
     if (src) { 
 
      this.Init(src); 
 
     } 
 
    } 
 

 
    Init(src: UniformGrid<ItemT>) { 
 

 
     this.splice(0, this.length) // mUniformGrids.Clear() ; 
 
     console.assert(typeof src === 'object', typeof src); 
 
     // let numUniformGrids = this.PrecomputeNumUniformGrids(src) ; 
 
     // this.mUniformGrids.Reserve(numUniformGrids) ; // Preallocate number of UniformGrids to avoid reallocation during PushBack. 
 

 
     let uniformGrid = new UniformGrid<ItemT>(src.itemType); 
 
     // uniformGrid.Decimate(src , 1) ; 
 
     // uniformGrid.Init() ; 
 
     this.push(uniformGrid); 
 

 
     // (...) 
 
    } 
 
} 
 

 
function doTests() { 
 

 
    console.info("Test > NestedGrid ; UniformGrid"); 
 

 
    let mInfluenceTree: NestedGrid<any> = new NestedGrid<any>(); // Influence tree 
 
    let ugSkeleton = new UniformGrid<any>(null); 
 
    mInfluenceTree.Init(ugSkeleton); 
 

 
    console.log(mInfluenceTree); 
 

 
    mInfluenceTree.Init(ugSkeleton); 
 

 
    console.log(mInfluenceTree); 
 
} 
 

 
doTests();
生成

(ES6対象)以下のJavascript typescriptですで私のコードの抜粋です。

"use strict"; 
 
class UniformGridGeometry extends Array { 
 
    constructor(itemType) { 
 
     super(); 
 
     this.itemType = itemType; 
 
    } 
 
} 
 
class UniformGrid extends UniformGridGeometry { 
 
    constructor(itemType) { 
 
     super(itemType); 
 
    } 
 
} 
 
class NestedGrid extends Array { 
 
    constructor(src) { 
 
     super(); 
 
     if (src) { 
 
      this.Init(src); 
 
     } 
 
    } 
 
    Init(src) { 
 
     this.splice(0, this.length); 
 
     console.assert(typeof src === 'object', typeof src); 
 
     let uniformGrid = new UniformGrid(src.itemType); 
 
     this.push(uniformGrid); 
 
    } 
 
} 
 
function doTests() { 
 
    console.info("Test > NestedGrid ; UniformGrid"); 
 
    let mInfluenceTree = new NestedGrid(); 
 
    let ugSkeleton = new UniformGrid(null); 
 
    mInfluenceTree.Init(ugSkeleton); 
 
    console.log(mInfluenceTree); 
 
    mInfluenceTree.Init(ugSkeleton); 
 
    console.log(mInfluenceTree); 
 
} 
 
doTests();

firefoxやコードスニペットと同じコードがうまくいきますが、クロムでアサーションが失敗し、引数 'src'が数値(配列のサイズ)になります。何が間違っていますか?

chromium splice failing

おかげ(二初期化呼び出しはWebGLのループの処理をシミュレートします)。

答えて

1

spliceは、削除された要素を返すための新しい配列を作成し、呼び出された要素のクラスを再利用するため、目的のサイズのカスタムコンストラクタを呼び出します。

ここでは、もう1つの方法でアレイを空にすることで問題を解決できます。サイズを0に設定します。別の解決策は、配列のコンストラクタは、あなたはサブクラスで実装しようとしているものとは異なる振る舞いを持っているとして、あなたが拡張するクラスの契約を尊重することであったかもしれない

this.length = 0; 

this.splice(0, this.length); 

を交換してください。

仕様については、グレーの領域にあることに注意してください。 Arrayのような基本クラスを拡張することを避ける方が賢明でしょう。

+0

説明していただきありがとうございます。私はArrayの "arrayLength"コンストラクタとのこの競合に気付きませんでした! 修正はchromiumでうまくいきますが、私はあなたのアドバイスに従いますので、Arrayクラスを全く拡張する必要はありません。拡張クラス内から空にする代わりに、新しい配列を作成するように設計を変更します。 –

関連する問題