2012年10月9日火曜日

TStringHelper.substring

TStringHelper が、色々便利なので使いまくっているのですが、引っかかった事を1つ。

それは、TStringHelper.Substring です。
TStringHelper には Copy 関数とは別の Copy メソッド(from DEKO さん)があります。
Copy メソッドがあるから、TStringHelper だと一般的名称の Substring に置き換わったんだなーなんて気楽に構えていると死にます!
というか死んだ!

下記の様に TStringHelper.substring を Copy 関数の代わりに使ったとします。

1 procedure Test;
2 var
3  Str: String;
4 begin
5  Str := 'Hello, helper !';
6  Writeln(Str.Substring(1, 5)); // 期待する出力 'Hello'
7 end;

期待する出力は↓ですが

Hello

実際には

ello,

こうなります。

つまり、Substring の開始 index は "0" なのです!

Delphi の String 型は歴史的経緯により、index は 1 から始まります

C++Builder のために一般的な index に合わせたのかな……。
と、そんな訳で TStringHelper.Substring を使うときはお気を付けを。

……index が 1 始まりの Copy 関数的なメソッド追加されないかな。混乱するだろうけど。

2 件のコメント:

  1. TStringHelper経由だと原則0オリジンのようですが、[]演算子のみ{$ZEROBASEDSTRINGS ON|OFF}の影響を受けて0/1オリジンが切り替えられるようです。
    https://twitter.com/kylix_rd/statuses/239061223734386688
    まだDelphi XE3を買っていないので試してませんけど…。

    返信削除
    返信
    1. なんと!
      それは知らなかったです。
      試してみます!!

      削除