オフィスアワーがそろそろ始まるよ!()

文字列

Zenにおける文字列の扱いについて解説します。

まず、Zenには文字列専用の型は存在しません。全てのテキストはUTF-8でエンコードされたバイト列として処理されます。

実行時に動的に文字数が変化する文字列を作るには、標準ライブラリのArrayListまたはBufferを使います。

文字列リテラル

文字列リテラルはu8の配列です。""で囲んだ中身が文字列リテラルになります。

examples/ch02-primitives/src/strings.zen:4:14

test "string literals" {
    const hello = "hello";
    ok(@typeOf(hello) == [5]u8);
    ok(hello[0] == 'h');

    // ひらがなは1文字3バイト
    const japanese = "こんにちは";
    ok(@typeOf(japanese) == [15]u8);
    // 「こ」は`{ 0xe3, 0x81, 0x93 }`
    ok(japanese[0] == 0xe3);
}

いくつかの文字はバックスラッシュ (\) によるエスケープが必要です。

文字 エスケープシーケンス
シングルクォート (') \'
ダブルクォート (") \"
改行 \n
キャリッジリターン \r
タブ \t
バックスラッシュ (\) \\
16進数文字コード \xHH
16進数Unicode \u{HHHHHH}

例えば、次のようなエスケープシーケンスにより、文字列リテラル内にUnicodeの文字を埋め込むことができます。

examples/ch02-primitives/src/strings.zen:17:21

test "escape sequence" {
    const japanese = "こんにちは";
    const unicode = "こ\u{3093}にちは";
    equalSlices(u8, japanese, unicode);
}

文字列リテラルの連結と文字列リテラルの積

配列リテラルと同様に、コンパイル時計算可能な文字列リテラルは、++演算子によって連結することができます。

examples/ch02-primitives/src/strings.zen:23:28

test "concatenates string literals" {
    const hello = "hello";
    const world = "world";
    const message = hello ++ " " ++ world ++ "\n";
    equalSlices(u8, message, "hello world\n");
}

また、コンパイル時計算可能な文字列リテラルは、**演算子によって複数回繰り返した文字列を作ることができます。

examples/ch02-primitives/src/strings.zen:30:34

test "multiplies string literals" {
    const hyphen = "-";
    const line = hyphen ** 10;
    equalSlices(u8, line, "----------");
}

C言語互換の文字列リテラル

C言語の文字列はNULL文字で区切られています。ZenはC言語との互換性を重要視しているので、C言語の文字列リテラルをサポートしています。

examples/ch02-primitives/src/strings.zen:36:42

test "c string" {
    const c_str = c"hello";
    ok(@typeOf(c_str) == [*]const u8);
    ok(c_str[4] == 'o');
    // NULL文字 (`0`) で区切られている
    ok(c_str[5] == 0);
}

C言語の文字列リテラルを定義する場合、c""と先頭にcを付けます。

C言語の文字列リテラルは、Zenの配列やスライスのような安全性チェックが及ばないため、C言語とのインタフェース以外では、利用しないことを推奨します。

文字列のスライス

文字列はu8の配列なので、スライスとして使用することもできます。

examples/ch02-primitives/src/strings.zen:45:50

test "string slice" {
    const hello = "hello world";
    const world = hello[6..];

    equalSlices(u8, world, "world");
}

☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2019 connectFree Corporation. All rights reserved.
Zen, the Zen three-circles logo and The Zen Programming Language are trademarks of connectFree corporation in Japan and other countries.