Macromedia Flash非公式テクニカルノート

String.splitメソッドを再定義する[上級テクニック]

ID: FN0201004 Product: Flash

Platform: All
Version: 5.0

このノートでは、オブジェクトのメソッドを再定義する上級者向けのサンプルを、ご紹介します。

1. String.splitの問題点
Flash 5.0の'String.split'メソッドには、いくつかの問題点が挙げられます。

まず、その仕様です。「ActionScript辞書」によれば、引数となる区切り文字を指定しないと、ストリング全体をひとつの要素とした配列を返すことになっています。けれど、実際には、ストリングは","(カンマ)で配列要素に分けられます。また、引数の区切り文字を""(空白ストリング)で指定したとき、「ActionScript辞書」にはストリングのひと文字ずつを要素とした配列を返すとあります。しかし、このときは、ストリング全体がひとつの配列要素になります。「ActionScript辞書」の記述は、ECMA-262の仕様に則っています。したがって、実際の動作の方に問題があると思われます。

つぎに、処理速度です。Flash 5.0は、バージョン4.0のコードをベースに、ストリングの処理を行っているように見受けられます。実際、使用禁止のFlash Player 4の関数を使った方が、処理速度は相当程度速くなるケースもあります。この'String.split'メソッドは、その典型です。使用禁止の'substring'を使ってスクリプトを作成した方が、ビルトインの'String.split'メソッドより速い処理を実現することができます。

*注記 'substring'関数は、2バイト文字に対応していません。2バイト文字を処理するためには、スクリプト中の'substring'を2バイト文字対応の'mbsubstring'に置換えてください。ただし、'mbsubstring'関数の処理スピードは、'substring'よりも遅くなります。

次項では、オブジェクトの'prototype'プロパティを使って、'String.split'メソッドを再定義するサンプルをご紹介します(「ActionScriptリファレンス」の「ActionScriptを使ったスクリプトの記述」の章の「カスタムオブジェクトの使用」の項をご参照ください)。

2. String.splitの再定義スクリプト
仕様は、基本的にビルトインの'String.split'メソッドと同様です。ただし、1で述べた問題となる動作については、「ActionScript辞書」の記載、つまりECMA-262の仕様にもとづくものとします。さらに、追加として、2文字以上からなる区切り文字にも対応することとしました。上級者向けのサンプルですので、処理内容はコメントとして記載しました。

// ムービーの第1フレームにフレームアクションとして定義
// [ビルトインメソッドに追加・変更した区切り文字指定]
// 複数文字からなる区切り文字を指定可能
// 区切り文字を指定しないとストリング全体をひとつの配列要素とする
// 空白文字("")を指定すると1文字ずつ配列要素に区切る
String.prototype.split = xSplit;   // ビルトインメソッドを再定義
// String.splitの再定義function
function xSplit (sDelimiter) {
    // 結果を格納する配列の初期化
   var lResult = new Array();
    // 引数の指定がない場合
   if (sDelimiter == null) {
     lResult[0] = this;
   } else {
  // 通常の処理の場合
      // 変数の初期化
     var i = 0;
     var nIndex = 0;
     var nStart = 1;
     var nLength = this.length;
     var nDelimLength = sDelimiter.length;

      // 区切り文字が空白("")以外の場合
     if (nDelimLength>=1) {
        // ストリングすべてを検索
       while (++i<=nLength) {
           // 区切り文字があった場合
         if (substring(this, i, nDelimLength) == sDelimiter) {
             // 区切り文字の前までのストリングを配列に格納
           lResult[nIndex] = substring(this, nStart, (i-nStart));
             // 変数の更新
           nStart = i+nDelimLength;
           i = nStart-1;
           ++nIndex;
         }
       }

         // 最後のストリングを配列に格納
       lResult[nIndex] = substring(this, nStart, -1);
     } else {
  // 区切り文字が空白("")の場合
        // すべてのストリングを1文字ずつ配列に格納
       while (i<nLength) {
         lResult[i] = substring(this, ++i, 1);
       }
     }
   }
   return lResult;
}

_____

作成者: 野中文雄
協力者: Ginga Baba   youichi
更新日: 2002年3月4日 2バイト文字対応についての注記を追加
作成日: 2002年1月30日


© 2001 and beyond Fumio Nonaka All rights reserved.