Search…
文字列
Vでは文字列の定義も:=演算子で行えます。他の変数と同様、文字列もデフォルトでイミュータブルです。文字列を(リテラルとして)表現するときには""''のどちらでも使えます。vfmtで書式を整えると、文字列リテラルを囲む""は、文字列の中に'を含んでいなければすべて''に変換されます。
1
name := 'Bob'
2
println(name) // Bob
3
println(name.len) // 3
Copied!
文字列の長さは.lenで取得できます。

式展開(interpolation)

文字列の中で$に続けて変数名を書くと、変数の値を文字列に展開できます。
1
name:= 'Bob'
2
println('Hello $name!') // Hello Bob!
Copied!
変数よりも複雑な式も、${}構文で式展開できます。
1
struct User {
2
name string
3
age int
4
}
5
bob := User {
6
name: 'Bob'
7
age: 17
8
}
9
println('Say Hello to a new User: ${bob.name}, ${bob.age}')
10
// Say Hello to new User: Bob, 17
11
println('${bob.name}s age is higher or equal to 18: ${bob.age >= 18}')
12
// 0 <=> number representation for false
Copied!

文字列の結合

文字列は+演算子で結合できます。
1
text := 'Hello'
2
concatenated_text := text + ' World!'
3
println(text) // Hello
4
println(text + ' World!') // Hello World!
5
println(concatenated_text) // Hello World!
Copied!
文字列の後ろに別の文字列を結合する操作は+=演算子でも行えます。文字列はデフォルトでイミュータブルなので、この操作はmutと宣言されている場合にのみ可能です。
1
mut hello := 'Hello '
2
hello += 'from V!' // helloに保存されている文字列に'from V!'を追加する
3
println(hello) // Hello from V!
Copied!
Vの文字データはUTF-8でエンコードされます。また、文字データの実体はリードオンリーのバイト配列です。これによって文字列のスライシングが可能になります。つまり、単一文字のリテラルにアクセスすることも、文字列変数のスライスにアクセスすることもできます。
1
robert := 'Robert'
2
bert := robert[2..robert.len] // bert
3
rob := robert[0..3] // Rob
4
println('The persons of interest are: $robert, $bert, $rob') // The persons of interest are: Robert, bert, Rob
Copied!

注意

some_string[開始位置..終了位置]という構文の終了位置は、終了位置そのものは含みません(not inclusive)。
Vのどの演算子についても、両辺に同じ型の値が必ず存在しなければなりません。以下のコードは、ageint型なのでコンパイルされません。
1
age := 25
2
println('age = ' + age) // cannot convert `int` to `string`
Copied!
つまり、.str()で文字列に変換するか、式展開を使う必要があります。Vでは式展開が推奨されています。
1
age := 25
2
println('age = ' + age.str()) // age = 25
3
println('age = $age') // age = 25 -- 推奨
Copied!
文字リテラルを定義するには`` を用います。raw stringの冒頭にrを付けるとエスケープされなくなります。
1
hello := 'Hello\nWorld'
2
println(hello) // Hello
3
// World
4
raw_hello := r'Hello\nWorld'
5
println(raw_hello) // Hello\nWorld
Copied!