カサレリア。katzenです。
前回は
V言語の変数として、変数の宣言やミュータブル・イミュータブルの考え方があることを紹介しました。
今回は、文字列について紹介したいと思います。
基本
str1 := 'シングルコーテーション'
str2 := "ダブルコーテーション"
println(str1)
println(str2)
と大体のプログラムと一緒かと思います。
V言語ではシングルコーテーション、ダブルコーテーションで違いはありません。
文字列結合
また、文字列を結合する場合は+
でつなげることが出来ます。
first := 'hello '
second := 'world'
println(first + second)
>>> hello world
ライブラリにはJavaなどでおなじみ(?)の
Builderもあるようです。
変数展開
言語によっては、ダブルコーテーションは変数展開が出来て、シングルコーテーションはそのまま出力できるものもありますが、V言語に違いはありません。
変数を文字列内で展開する場合、$を変数の最初につけます。
str := 'world'
println('hello $str')
>>>hello world
では、$
を表示したい場合、どうしたらいいでしょうか。
そもそも$
が置き換わるのにはルールがあります。
それは$
の次が英字か{(大かっこ)の場合だけ、展開しようとします。
つまり↓では$
はそのまま表示されます。
println('$')
println('$100')
println('$ 55')
println('$.01')
println('$(9)')
ですので、
dollar := '$'
println("show $dollar")
このように、一旦変数に入れてしまって、表示するのがいいのではないでしょうか。
エスケープできるかと思ったのですが、うまくいきませんでした。
いい方法があれば教えてもらえると嬉しいです。
変数名
さて、変数展開において、もう1つ問題になるのがどこまでが変数名かというところです。
例えば
// 100Yenと表示したい
price := '100'
println('$priceYen')
これだとエラーが出ます。priceYenという変数がないためですね。
感のいい人は$
が置き換わる説明でピンと来たかもしれません。
そうです{}
でくくるのです。
price := '100'
println('${price}Yen')
これで目的の表示が出来ます。
ちなみにこの{}
は少し特別で、変数名の範囲を指定するにとどまらず、算術式が使えたりします。次回あたりで詳しく紹介したいと思います。
エスケープ
これまでに紹介したとおり、V言語の文字列は変数展開されます。また改行なども展開されることは期待するとおりだと思います。
crlf := "\r\n"
println("line 1${crlf}line 2") // 改行されます。
では、展開されたくない場合どうすればいいでしょうか。
1つはだいたいの言語と同じでエスケープ\
してあげれば大丈夫です。
crlf2 := "\\r\\n"
println("line 1${crlf2}line 2") // 改行されません。
もう1つはr
を文字列の頭につけることで、全体をエスケープ出来ます。
crlf3 := r"\r\n"
println("line 1${crlf3}line 2") // 改行されません。
文字列の長さ
文字列の長さは.len
で取得できますが、リテラル文字列はバイト単位になります。
english := 'abcde'
japanese := '日本語'
println(english.len)
>>> 5
println(japanese.len)
>>> 9
println(english[0]) // 文字コードが取得できます。
>>> 97
println(english[1..3]) // 範囲で取得することも出来ます
>>> bc
println(english[0..1]) // 1文字だけ取りたい場合
>>> a
では、日本語などのマルチバイト文字の長さを知るにはどうすればいいでしょうか。V言語ではruneを使用します。
runeについては、後日くわしく書こうと思いますが、
Howtoとして.rune()
を使用すると覚えてください。
japanese2 := 'にほんご'
japanese3 := japanese2.runes()
println(japanese3)
>>> [`に`,`ほ`,`ん`,`ご`]
println(japanese3.len) // マルチバイト対応文字列長
>>> 4
println(japanese3[0]) // この場合1文字取得できます
>>> に
println(japanese3[1..3]) // 範囲で取得する場合
>>> [`ほ`,`ん`]
数値に変換
文字列を数値に変換する場合、.int()
やf32()
を使うことで実現できます。
公式を見ると、他にも
u8()
などのように型と長さごとに存在します。
val1 := '12345'.int()
println(val1+5)
>>> 12350
val2 := '0.5'.f32()
println(val2+0.7)
>>> 1.2