(78) Text.GetIndexOf の戻り値が説明と異なる

Small Basic Forum の text.GetIndexOf return 0 not -1 より。

Is it a bug that text.getIndexOf() returns 0 instead of -1 when a substring is not found?
(Text.GetIndexOf が部分文字列を見つけない時に -1 ではなく 0 を返すんだけど、バグかなあ?)

…あらまあ。

rdohmen ( Rene ) さんの挙げた質問に対して、モデレータの Khumara さんが、

I've confirm that this is a valid bug. We'll fix it on the next version.
(これは明らかにバグだねー。次のバージョンで直すつもりだよ。)

と回答されていますので、v0.9 (?) ではこのあたりの動作が変わりそうですね。


で、どのへんがどうなっているのかというと。

Small Basic IDE の右側に表示される Text.GetIndexOf の説明は、

The position at which the sub-text appears in the specified text.  If the text doesn't appear, it returns -1.

となっていまして。公式な日本語版での説明は、

指定されたテキスト中のサブテキストの位置です。そのテキストが無い場合は、 -1 を返します。

私の私訳でも

指定したテキスト中のサブテキストの位置。サブテキストが見つからなかった場合は、-1を返します。

となっているわけです。

で、実際にこのへんの動作を確認してみると、

BaseText="text.GetIndexOf return 0 not -1"
TextWindow.WriteLine("1234567890123456789012345678901")
TextWindow.WriteLine(BaseText)
TextWindow.WriteLine("")

TextWindow.Write("Text.GetIndexOf(BaseText,'x')= [")
TextWindow.WriteLine(Text.GetIndexOf(BaseText,"x") + "]")
TextWindow.Write("Text.GetIndexOf(BaseText,'e')= [")
TextWindow.WriteLine(Text.GetIndexOf(BaseText,"e") + "]")
TextWindow.Write("Text.GetIndexOf(BaseText,'t')= [")
TextWindow.WriteLine(Text.GetIndexOf(BaseText,"t") + "]")
TextWindow.Write("Text.GetIndexOf(BaseText,'v')= [")
TextWindow.WriteLine(Text.GetIndexOf(BaseText,"v") + "]")
TextWindow.WriteLine("")

image

検索する文字列が見つからなかった場合は「0」が返ってくるという状態なわけですね。
1 文字目に見つかれば「1」、2文字目に見つかれば「2」、…とまあある意味わかりやすいような気もします。

比較対象として、VB ( というか .NET 系言語 ) で IndexOf を使って同じようなことをさせてみると、

Sub Main()

    Dim BaseText = "text.GetIndexOf return 0 not -1"

    Console.WriteLine("BaseText.IndexOf('x') = [" & BaseText.IndexOf("x").ToString & "]")
    Console.WriteLine("BaseText.IndexOf('e') = [" & BaseText.IndexOf("e").ToString & "]")
    Console.WriteLine("BaseText.IndexOf('t') = [" & BaseText.IndexOf("t").ToString & "]")
    Console.WriteLine("BaseText.IndexOf('v') = [" & BaseText.IndexOf("v").ToString & "]")

    Console.WriteLine("")
    Console.Write("Press any key to continue…")
    Console.Read()

End Sub

image

検索する文字列が見つからなかった場合は「-1」、1 文字目に見つかれば「0」、2文字目に見つかれば「1」、…と、常に「~文字目-1」の値となるわけです。

見つからなかった場合に「-1」とするなら、その後の「見つかった時に戻す数値」も連続していた方がいいでしょうから、口で言う「~文字目」から常に 1 小さい数値が戻ってくるシカケです。

「1」文字目なのに「0」、って、私なんかは実はなかなかピンとこない部分がありまして。
「1」文字目なんだから「1」って方がわかりやすいよなー、と思うんですが。

次のバージョンで直しちゃうということですが、説明を直すのか実装を直すのか、ちょっとハラハラするところではあります。


ちなみに、対象文字列が日本語文字だった場合はどうなるかといいますと、

BaseText="-1ではなく0が返ってきちゃうんだぜ?"
TextWindow.WriteLine("1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9")
TextWindow.WriteLine(BaseText)
TextWindow.WriteLine("")

TextWindow.Write("Text.GetIndexOf(BaseText,'で')= [")
TextWindow.WriteLine(Text.GetIndexOf(BaseText,"で") + "]")
TextWindow.Write("Text.GetIndexOf(BaseText,'1')= [")
TextWindow.WriteLine(Text.GetIndexOf(BaseText,"1") + "]")
TextWindow.Write("Text.GetIndexOf(BaseText,'-')= [")
TextWindow.WriteLine(Text.GetIndexOf(BaseText,"-") + "]")
TextWindow.Write("Text.GetIndexOf(BaseText,'あ')= [")
TextWindow.WriteLine(Text.GetIndexOf(BaseText,"あ") + "]")
TextWindow.WriteLine("")

image

全角でも 1 文字は 1 文字、という結果になりましたよ。ツカエますね。にやり。

2 コメント

  1. さるべーじ より:

    その後、他のText系機能も試してみましたが、やはり「1文字目なら『1』」で統一されている感があります。
    なので、見つけられなかった時は「0」ってんがやはり素直なんではないかと。

    とりあえず、リファレンスの方は現行の仕様に合わせて直しておくことにします。v0.9でも変わらないことを望みます。

  2. さるべーじ より:

    後日譚。

    話題を投げっぱなしにして忘れておりましたごめんなさい。
    今確認したら、やはりサブテキストが見つかわない場合は相変わらず「0」を返していました。

    で、説明文の方が直っています。

    「そのサブテキストが存在しなかった場合は0を返します。」

    だそうで。
    手元にある履歴も確認してみたら、v0.90で各国語版の説明ファイルが全部直っておりましたよ。

コメントを投稿