String in JavaFX
今更ながら...
String について知らなかったことが 2つ もあったので書き留めておきます。
それは...
- 文字列リテラルを縦 (横もOK) に並べるだけで結合できる (C 言語と同様)
- null は 空文字列 に変換される
の2つです。
前者は、ちゃんと Language Reference にも書いてありましたが...
以下のように文字列リテラルを縦に並べるだけで結合できるので 非常に便利です。
JavaFX は 文字列を + で結合できないため concat するしかないと思い込んでいただけにちょっと感動です。
def greeting = "Hello " 'there'; println( greeting );
実行結果:
Hello there
後者は、多くの NPE によるバグを救ってくれるので、非常にありがたいように思いますが...
実は この仕様のために思わぬバグを生むこともあるのです。
今回、自分も思い切りハマったのですが、次の典型的なコードは意図しない動きをします。
このコードでファイルなどを読み込んだ場合、空行が含まれているとそれ以降の行が読み込まれないのです。
var r = new java.io.BufferedReader(in); var s: String; while ((s = r.readLine()) != null) { println(s); }
実は JavaFX では "" == null は 真 になります。
たぶん null が 空文字に変換されるからだと思いますが...
実際に...
println("" == null)
を実行してみると
true
と出力されます。
ちなみに、この仕様も Language Reference に ちゃんと明記されていました。最初はわかりませんでしたが...
String のようにカーディナリティが Required のデータ型については null を許容しないようです。
null を代入すると 初期値に変換されてしまいます。
この問題は この日記で作成した 『TranslatorFX』 で気が付いたのですが...
文の途中に空行を入れて、翻訳ボタンを押すと空行以降の文が翻訳されないのです。
正確には、翻訳されているのですが読み込めていないのです。
このバグは本日中には修正する予定ですので、この現象を試してみたい方は (いるわけないか?) 本日中に...
追伸:
上記の 『TranslatorFX』 の不具合を修正しました。
詳細については、次回と言うことで...