Arrayに関数を追加しても使えない?

Array.assignStructやDictionary.assignStructで二次元配列などをコピーすると、中に入っている分の配列はシステム側で新しく作成されます。そのような配列には追加した分の関数が反映されません。

以下のコードのERRORという部分では「testFuncが見つかりません」というエラーがでます。
(Array.testFunc incontextof bar[0])(); のように直接呼ばない形なら使えます。

// Array に関数を追加
Array.testFunc = function() { Debug.message("testFunc called"); };

var foo = [];
foo.testFunc(); // OK

foo[0] = [];
foo[0].testFunc(); // OK

var bar = [];
bar.assignStruct(foo);
bar.testFunc(); // OK

bar[0].testFunc(); // ERROR

assignStruct以外にも(const)を付けた場合や関数の可変長引数としての配列の場合などにも駄目なようです。

Array.testFunc = function() { Debug.message("testFunc called"); };

var foo = (const)[];
foo.testFunc(); // ERROR

[].saveStruct("array.tjs");
var bar = Scripts.evalStorage("array.tjs");
bar.testFunc(); // saveStructで保存すると(const)が付くので ERROR

function func(args*) {
  args.testFunc(); // ERROR
}
func();

saveStruct.dllのArray.save2など、プラグインで追加されるものについても同様です。

Arrayに関数を追加しても使えない?」への2件のフィードバック

  1. これはTJSのglobal空間に登録されているArrayクラスオブジェクトと,C++内のTJSCreateArrayObject()で使用されるArrayクラスオブジェクトが(global空間のそれとは)別物なことが原因かと思われます。
    tjs.cppのtTJS::tTJS()内の
    // Array
    dsp = new tTJSArrayClass();

    iTJSDispatch2 *dummy = TJSCreateArrayObject(&dsp);
    dummy->Release();
    として同一のクラスオブジェクトにすると直るかもしれません(ただし動作未確認です)

  2. コメントありがとうございます。
    ご指摘頂いた部分のみでは(const)のついた配列が駄目だったので、tjs.yの同じ部分を修正したところ全部動くようになりました。
    tjs.yまで変えるとコンテキストがおかしくなってArray.countなどが使えなくなるようでした。
    (const)つけた配列はそもそもコンパイルしたときに使えなくなるようなのでそっちは気にしないことにします。

小松 直矢 へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です