はじめに
Flutterでアプリを作っていた時、Dartの文法について調べて知ったことを書いておきます。
僕の思い込み
アプリの仕様で文字列の最後の文字を取得する必要があり、何も考えずにstr[-1]
としたところ、エラー画面が出てコンソールには以下のように出力されました。
Uncaught exception:
RangeError (index): Index out of range: index must not be negative: -1
Dart 「-1はインデックスの範囲外だよ。それにインデックスに負の数は指定しないでね。」
僕がさわったことのある他の言語ではできたので、どの言語でもできるもんだと思っていました。
少し調べただけでも、
- C
- C++
- Java
- PHP
- JavaScript
では0以上を指定する必要があるんですね。マイナスでもいい言語の方がマイナーなんですかね?
公式ドキュメントによると
List<String> languages = ['English', 'Spanish' ,'Chinese', 'Japanese'];
String country = 'Japan';
// Listの場合
print(languages[-1]); // エラーが出る
print(languages.last); // Japanese と出力される
print(languages[languages.length - 1]); // Japanese と出力される
// Stringの場合
print(country[-1]); // エラーが出る
print(country.last); // エラーが出る
print(country[country.length - 1]); // n と出力される
- 最後の要素を取得したいのであれば、配列なら
last
というListクラスのプロパティを使うことができます。Stringでは使えません。 - 「最後から2番目」のように最後から数えた位置にある要素を取得したい場合は、
languages.length - 2
のように配列に含まれる要素の数から「〇番目」の数だけ引いてやればインデックスを求められます。これはListとStringのどちらでも使えます。
注意点
- どちらの場合も要素が1つ以上存在する必要があります。
- 2の方法では、要素数から引いた後の数がマイナスになってしまうと、マイナスの数を指定したのと同じことですからエラーが出ます。