👉 TOML 言語は Rust プロジェクトで広く使用されており、cargo new で新しいプロジェクトを作成すると、必ず toml の設定ファイルが新規作成されるため、Rust を学ぶ過程で TOML 言語の関連文法に慣れることが必要です。これにより、Rust プロジェクト内で設定ファイルをスムーズに編集できるようになります。
👉 本文は toml-lang の中国語翻訳版 からのもので、Rust 学習者が統一して参照できるようにここに収録されています。もし誤りや改善が必要な箇所を見つけた場合は、toml.io の元プロジェクトリポジトリで指摘または修正してください。
TOML v1.0.0#
全称:Tom の(意味的に)明確で、(設定が)最小限の言語。(Tom's Obvious, Minimal Language)
作者:Tom Preston-Werner、Pradyun Gedam など。
宗旨#
TOML は、意味が明確で読みやすい最小限の設定ファイル形式を目指しています。
TOML は、ハッシュテーブルに無曖昧にマッピングできるように設計されています。
TOML は、さまざまな言語のデータ構造に簡単に解析できるべきです。
目次#
- 仕様
- コメント
- キーと値のペア
- キー名
- 文字列
- 整数
- 浮動小数点数
- ブール値
- 座標日時
- 地域日時
- 地域日付
- 地域時刻
- 配列
- テーブル
- インラインテーブル
- テーブル配列
- ファイル拡張子
- MIME タイプ
- ABNF 文法
仕様#
- TOML は大文字と小文字を区別します。
- TOML ファイルは合法な UTF-8 エンコードの Unicode ドキュメントでなければなりません。
- 空白はタブ(0x09)またはスペース(0x20)を指します。
- 改行は LF(0x0A)または CRLF(0x0D0A)を指します。
コメント#
井文字は、その行の残りの部分をコメントとしてマークしますが、文字列内にある場合は除きます。
# これは全行コメントです
key = "value" # これは行末コメントです
another = "# これはコメントではありません"
タブ以外の制御文字(U+0000 から U+0008、U+000A から U+001F、U+007F)はコメント内に出現することは許可されていません。
キーと値のペア#
TOML ドキュメントの最も基本的な構成ブロックはキーと値のペアです。
キー名は等号の左側にあり、値は右側にあります。
キー名と値の周囲の空白は無視されます。
キー、等号、値は同じ行に存在する必要があります(ただし、一部の値は複数行にわたることができます)。
key = "value"
値は以下のいずれかの型でなければなりません。
値を指定しないことは不正です。
key = # 不正
キーと値のペアの後には改行が必要です(またはファイルの終わり)。
(例外は インラインテーブル を参照)
first = "Tom" last = "Preston-Werner" # 不正
キー名#
キー名は裸のもの、引用符で囲まれたもの、またはドットで区切られたものです。
裸のキーは ASCII 文字、ASCII 数字、アンダースコア、ハイフン(A-Za-z0-9_-
)のみを含むことができます。
裸のキーは純粋な ASCII 数字のみで構成されることも許可されますが、これは文字列として解釈されます。
key = "value"
bare_key = "value"
bare-key = "value"
1234 = "value"
引用符付きキーは基本文字列またはリテラル文字列と同じ規則に従い、より広範なキー名を使用することを許可します。
明らかに必要でない限り、裸のキーを使用することが最良の実践です。
"127.0.0.1" = "value"
"character encoding" = "value"
"ʎǝʞ" = "value"
'key2' = "value"
'quoted "value"' = "value"
裸のキーは空であってはならず、空の引用符付きキーは許可されます(ただし推奨されません)。
= "no key name" # 不正
"" = "blank" # 合法だが推奨されない
'' = 'blank' # 合法だが推奨されない
ドット区切りキーは、ドットでつながれた一連の裸のキーまたは引用符付きキーです。
これにより、関連する属性をまとめることができます:
name = "Orange"
physical.color = "orange"
physical.shape = "round"
site."google.com" = true
JSON の以下の構造に相当します:
{
"name": "Orange",
"physical": {
"color": "orange",
"shape": "round"
},
"site": {
"google.com": true
}
}
ドット区切りキーの定義テーブルの詳細については、後の テーブル セクションを参照してください。
ドット区切りの周囲の空白は無視されます。
ただし、最良の実践として、不要な空白を使用しないことをお勧めします。
fruit.name = "banana" # これは最良の実践です
fruit. color = "yellow" # fruit.color と同等
fruit . flavor = "banana" # fruit.flavor と同等
インデントは空白として扱われ、無視されます。
同じキーを複数回定義することは不正です。
# こうしないでください
name = "Tom"
name = "Pradyun"
裸のキーと引用符付きキーは等価であることに注意してください:
# これは不正です
spelling = "favorite"
"spelling" = "favourite"
キーがまだ直接定義されていない限り、そのキーとその下位キー名に値を割り当てることができます。
# これにより「fruit」キーがテーブルとして存在します。
fruit.apple.smooth = true
# したがって、次に「fruit」テーブルに内容を追加できます:
fruit.orange = 2
# 以下は不正です
# これにより fruit.apple の値が整数として定義されます。
fruit.apple = 1
# しかし次にこれにより fruit.apple がテーブルのように扱われます。
# 整数はテーブルに変わることはできません。
fruit.apple.smooth = true
ドット区切りキーを飛び飛びに定義することは推奨されません。
# 合法だが推奨されない
apple.type = "果物"
orange.type = "果物"
apple.skin = "薄"
orange.skin = "厚"
apple.color = "赤"
orange.color = "オレンジ"
# 推奨
apple.type = "果物"
apple.skin = "薄"
apple.color = "赤"
orange.type = "果物"
orange.skin = "厚"
orange.color = "赤"
裸のキーは ASCII 整数のみで構成できるため、浮動小数点数のように見えるが実際には二つの部分からなるドット区切りキーを書くことができます。
十分な理由がない限り(基本的にはあまりない)、そうしないでください。
3.14159 = "パイ"
上記の TOML は以下の JSON に対応します。
{ "3": { "14159": "パイ" } }
文字列#
文字列を表す方法は 4 つあります:基本文字列、複数行基本文字列、リテラル文字列、および複数行リテラル文字列。
すべての文字列は有効な UTF-8 文字のみを含むことができます。
基本文字列は引用符("
)で囲まれています。
エスケープが必要なものを除いて、任意の Unicode 文字を使用できます:引用符、バックスラッシュ、およびタブ以外の制御文字(U+0000 から U+0008、U+000A から U+001F、U+007F)。
str = "私は文字列です。\"あなたは私を引用できます\"。名前\tJos\u00E9\n場所\tサンフランシスコ。"
便利なことに、一部の一般的な文字には簡単なエスケープ記法があります。
\b - バックスペース (U+0008)
\t - タブ (U+0009)
\n - 改行 (U+000A)
\f - フォームフィード (U+000C)
\r - キャリッジリターン (U+000D)
\" - 引用 (U+0022)
\\ - バックスラッシュ (U+005C)
\uXXXX - Unicode (U+XXXX)
\UXXXXXXXX - Unicode (U+XXXXXXXX)
任意の Unicode 文字は \uXXXX
または \UXXXXXXXX
の形式でエスケープできます。
エスケープコードは有効な Unicode スカラー値でなければなりません。
上記に列挙されていない他のエスケープシーケンスは予約されており、使用した場合、TOML はエラーを生成する必要があります。
時には小さなテキスト(例えば翻訳)を表現する必要があるか、非常に長い文字列を折り返したい場合があります。
TOML はこれを簡素化しています。
複数行基本文字列は三つの引用符で囲まれ、折り返しを許可します。
開き引用符の直後の改行は削除されます。
他の空白と改行はそのまま保持されます。
str1 = """
バラは赤い
スミレは青い"""
TOML パーサーは、プラットフォームで有効な改行文字を比較的柔軟に解析できます。
# Unix システムでは、上記の複数行文字列は次のように等価です:
str2 = "バラは赤い\nスミレは青い"
# Windows システムでは、次のように等価です:
str3 = "バラは赤い\r\nスミレは青い"
長い文字列を書きたいが無関係な空白を導入したくない場合は、「行末バックスラッシュ」を使用できます。
行の最後の非空白文字がエスケープされていない \
の場合、その行の後ろのすべての空白(改行を含む)は削除され、次の非空白文字または終了引用符まで続きます。
基本文字列に対して有効なすべてのエスケープシーケンスは、複数行基本文字列にも同様に適用されます。
# 次の各文字列は完全に同じバイトです:
str1 = "素早い茶色の狐が怠け者の犬を飛び越えます。"
str2 = """
素早い茶色の \
狐が飛び越えます \
怠け者の犬を。"""
str3 = """\
素早い茶色の \
狐が飛び越えます \
怠け者の犬を。\
"""
任意の Unicode 文字を使用できますが、エスケープが必要なもの(バックスラッシュおよびタブ、改行、キャリッジリターン以外の制御文字(U+0000 から U+0008、U+000B、U+000C、U+000E から U+001F、U+007F))は使用できません。
複数行基本文字列内の任意の場所に引用符または二つの隣接する引用符を書くことができます。
それらは区切り記号の直近の位置に書くこともできます。
str4 = """ここには二つの引用符があります:""。簡単です。"""
# str5 = """ここには二つの引用符があります:"""。""" # 不正
str5 = """ここには三つの引用符があります:""\"。"""
str6 = """ここには十五の引用符があります:""\"""\"""\"""\"""\"。"""
# "これ、"彼女は言った、"ただの無意味な条項です。"
str7 = """"これ、"彼女は言った、"ただの無意味な条項です。""""
Windows パスや正規表現を指定する必要がある場合、バックスラッシュをエスケープすることは面倒で間違いやすくなります。
これを解決するために、TOML はリテラル文字列をサポートしており、エスケープを完全に許可しません。
リテラル文字列は単一引用符で囲まれています。
基本文字列と同様に、単一行としてのみ表現されます:
# 見たまま。
winpath = 'C:\Users\nodejs\templates'
winpath2 = '\\ServerX\admin$\system32\'
quoted = 'Tom "Dubs" Preston-Werner'
regex = '<\i\c*\s*>'
エスケープがないため、単一引用符で囲まれたリテラル文字列内に単一引用符を書くことはできません。
幸いなことに、TOML はこの問題を解決するために、複数行リテラル文字列をサポートしています。
複数行リテラル文字列は、両側に三つの単一引用符で囲まれ、改行を許可します。
リテラル文字列と同様に、エスケープは存在しません。
開始マーカーの直後の改行は削除されます。
開始と終了マーカーの間のすべての内容はそのまま保持されます。
regex2 = '''私は [dw]on't 2{2} りんごが必要です'''
lines = '''
原文の
最初の改行は削除されます。
他のすべての空白
は保持されます。
'''
複数行リテラル文字列内の任意の位置に一つまたは二つの単一引用符を書くことができますが、三つ以上の単一引用符の連続は許可されません。
quot15 = '''ここには十五の引用符があります:"""""""""""""""'''
# apos15 = '''ここには十五の撇号があります:'''''''''''''''''' # 不正
apos15 = "ここには十五の撇号があります:'''''''''''''''"
# 'それ、'彼女は言った、'まだ意味がありません。'
str = ''''それ、'彼女は言った、'まだ意味がありません。''''
タブ以外のすべての制御文字はリテラル文字列に出現することは許可されていません。
したがって、バイナリデータについては、Base64 または他の適切な ASCII または UTF-8 エンコーディングを使用することをお勧めします。
これらのエンコーディングの処理方法は、アプリケーションによって決定されます。
整数#
整数は純粋な数字です。
正の数にはプラス記号を付けることができます。
負の数の前にはマイナス記号があります。
int1 = +99
int2 = 42
int3 = 0
int4 = -17
大きな数の場合、数字の間にアンダースコアを使用して可読性を向上させることができます。
各アンダースコアの両側には少なくとも一つの数字が必要です。
int5 = 1_000
int6 = 5_349_221
int7 = 53_49_221 # インドの数体系のグループ
int8 = 1_2_3_4_5 # 合法だが推奨されない
先頭ゼロは許可されていません。
整数値 -0
と +0
は有効であり、前置きのないゼロと等価です。
非負整数値は、16 進数、8 進数、または 2 進数で表すこともできます。
これらの形式では、+
は許可されず、(接頭辞の後の)先頭ゼロは許可されます。
16 進数値は大文字と小文字を区別しません。
数字の間のアンダースコアは許可されます(ただし、接頭辞と値の間には存在できません)。
# `0x` 接頭辞のある16進数
hex1 = 0xDEADBEEF
hex2 = 0xdeadbeef
hex3 = 0xdead_beef
# `0o` 接頭辞のある8進数
oct1 = 0o01234567
oct2 = 0o755 # Unix ファイル権限を表すのに便利です
# `0b` 接頭辞のある2進数
bin1 = 0b11010110
任意の 64 ビット符号付き整数(−2^63 から 2^63−1)は受け入れられ、無損失で処理されるべきです。
整数を無損失で表現できない場合は、エラーをスローする必要があります。
浮動小数点数#
浮動小数点数は IEEE 754 binary64 値として実装されるべきです。
浮動小数点数は、整数部分(10 進整数値と同じ規則に従う)に続いて、小数部分および / または指数部分で構成されます。
小数部分と指数部分の両方がある場合、小数部分は指数部分の前に来なければなりません。
# 小数
flt1 = +1.0
flt2 = 3.1415
flt3 = -0.01
# 指数
flt4 = 5e+22
flt5 = 1e06
flt6 = -2E-2
# 両方
flt7 = 6.626e-34
小数部分は小数点の後に一つ以上の数字が続きます。
指数部分は E(大文字小文字を区別しない)に続いて整数部分(10 進整数値と同じ規則に従うが、先頭ゼロを含むことができる)で構成されます。
小数点が使用される場合、両側には少なくとも一つの数字が必要です。
# 不正な浮動小数点数
invalid_float_1 = .7
invalid_float_2 = 7.
invalid_float_3 = 3.e+20
整数と同様に、可読性を向上させるためにアンダースコアを使用できます。
各アンダースコアは少なくとも一つの数字で囲まれている必要があります。
flt8 = 224_617.445_991_228
浮動小数点数値 -0.0
と +0.0
は有効であり、IEEE 754 に従うべきです。
特殊な浮動小数点値も表現できます。
それらは小文字で表記されます。
# 無限大
sf1 = inf # 正の無限大
sf2 = +inf # 正の無限大
sf3 = -inf # 負の無限大
# NaN
sf4 = nan # 実際には信号NaNまたはサイレントNaNに対応し、実装によって異なります
sf5 = +nan # `nan` と等価
sf6 = -nan # 有効で、実際のコードは実装によって異なります
ブール値#
ブール値は、あなたが慣れている通りです。
小文字で表記します。
bool1 = true
bool2 = false
座標日時#
特定の時間を正確に表現するには、タイムゾーンオフセットを指定した RFC 3339 形式の日付時刻を使用できます。
odt1 = 1979-05-27T07:32:00Z
odt2 = 1979-05-27T00:32:00-07:00
odt3 = 1979-05-27T00:32:00.999999-07:00
可読性のために、日付と時刻の間の T を空白文字に置き換えることができます(RFC 3339 の第 5.6 節で許可されています)。
odt4 = 1979-05-27 07:32:00Z
ミリ秒単位の精度が必要です。
それ以上の精度の小数秒は実装に依存します。
その値が実装がサポートする精度を超える場合、超過部分は切り捨てられ、四捨五入されるべきではありません。
地域日時#
RFC 3339 日付時刻のタイムゾーンオフセットを省略すると、その日時の使用はタイムゾーンオフセットを含まないことを示します。
他の情報がない場合、それが世界のどの瞬間に変換されるべきかは不明です。
それでも変換を要求された場合、結果は実装に依存します。
ldt1 = 1979-05-27T07:32:00
ldt2 = 1979-05-27T00:32:00.999999
ミリ秒単位の精度が必要です。
それ以上の精度の小数秒は実装に依存します。
その値が実装がサポートする精度を超える場合、超過部分は切り捨てられ、四捨五入されるべきではありません。
地域日付#
RFC 3339 日付時刻の日時部分のみを記述した場合、それは一日全体を表し、タイムゾーンオフセットを含みません。
ld1 = 1979-05-27
地域時刻#
RFC 3339 日付時刻の時刻部分のみを記述した場合、それは特定の日付に関係なく、一日のその時刻を表します。
タイムゾーンオフセットは含まれません。
lt1 = 07:32:00
lt2 = 00:32:00.999999
ミリ秒単位の精度が必要です。
それ以上の精度の小数秒は実装に依存します。
その値が実装がサポートする精度を超える場合、超過部分は切り捨てられ、四捨五入されるべきではありません。
配列#
配列は値を含む角括弧です。
空白は無視されます。
子要素はカンマで区切られます。
配列は、キーと値のペアで許可されるのと同じデータ型の値を含むことができます。
異なる型の値を混在させることもできます。
integers = [ 1, 2, 3 ]
colors = [ "赤", "黄", "緑" ]
nested_array_of_ints = [ [ 1, 2 ], [3, 4, 5] ]
nested_mixed_array = [ [ 1, 2 ], ["a", "b", "c"] ]
string_array = [ "すべての", '文字列', """は同じです""", '''タイプ''' ]
# 異なる型の値を含む配列が許可されます
numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ]
contributors = [
"Foo Bar <[email protected]>",
{ name = "Baz Qux", email = "[email protected]", url = "https://example.com/bazqux" }
]
配列は複数行にわたることができます。
配列の最後の値の後に終端カンマ(尾カンマ)を付けることができます。
値、カンマ、終了角括弧の前には任意の数の改行とコメントを置くことができます。
配列の値とカンマの間のインデントは空白として扱われ、無視されます。
integers2 = [
1, 2, 3
]
integers3 = [
1,
2, # これは許可されます
]
テーブル#
テーブル(ハッシュテーブルまたは辞書とも呼ばれます)は、キーと値のペアの集合です。
テーブルは、テーブルヘッダーによって定義され、角括弧とともに別の行に現れます。
テーブルヘッダーは、配列とは異なり、配列は値のみを持つことがわかります。
[table]
その下には、次のテーブルヘッダーまたはファイルの終わりまで、すべてのキーと値のペアが含まれます。
テーブルは、指定された順序でキーと値のペアを保持することを保証しません。
[table-1]
key1 = "いくつかの文字列"
key2 = 123
[table-2]
key1 = "別の文字列"
key2 = 456
テーブル名の規則はキー名と同じです(前述の キー名 定義を参照)。
[dog."tater.man"]
type.name = "パグ"
JSON の以下の構造に相当します:
{ "dog": { "tater.man": { "type": { "name": "パグ" } } } }
キー名の周囲の空白は無視されます。
ただし、最良の実践として、余分な空白を持たないことをお勧めします。
[a.b.c] # これは最良の実践です
[ d.e.f ] # [d.e.f] と同等
[ g . h . i ] # [g.h.i] と同等
[ j . "ʞ" . 'l' ] # [j."ʞ".'l'] と同等
インデントは空白として扱われ、無視されます。
すべての親テーブルを完全に書く必要はありません。
TOML は適切に処理します。
# [x] あなた
# [x.y] いいえ
# [x.y.z] これらは必要ありません
[x.y.z.w] # これを有効にするために
[x] # 後置親テーブル定義は許可されています
空のテーブルは、キーと値のペアがない限り許可されます。
キー名と同様に、テーブルを再定義することはできません。
これを行うことは不正です。
# こうしないでください
[fruit]
apple = "赤"
[fruit]
orange = "オレンジ"
# こうしないでください
[fruit]
apple = "赤"
[fruit.apple]
texture = "滑らか"
無秩序にテーブルを定義することは推奨されません。
# 有効だが推奨されない
[fruit.apple]
[animal]
[fruit.orange]
# 推奨
[fruit.apple]
[fruit.orange]
[animal]
トップレベルテーブル、またはルートテーブルは、ドキュメントの開始時に始まり、最初のテーブルヘッダー(またはファイルの終わり)で終了します。
他のテーブルとは異なり、名前がなく、後置することはできません。
# トップレベルテーブルの開始。
name = "Fido"
breed = "パグ"
# トップレベルテーブルの終了。
[owner]
name = "Regina Dogman"
member_since = 1999-08-04
ドット区切りキーは、最後のキー名の前の各キー名に対してテーブルを作成し、定義します。これらのテーブルがまだ作成されていない場合に限ります。
fruit.apple.color = "赤"
# fruit という名前のテーブルを定義
# fruit.apple という名前のテーブルを定義
fruit.apple.taste.sweet = true
# fruit.apple.taste という名前のテーブルを定義
# fruit と fruit.apple はすでに作成されています
テーブルは一度だけ定義できるため、[table]
ヘッダーを使用してそのようなテーブルを再定義することは許可されません。
同様に、ドット区切りキーを使用して、すでに [table]
形式で定義されたテーブルを再定義することも許可されません。
ただし、[table]
形式を使用して、ドット区切りキーで定義されたテーブルのサブテーブルを定義することは許可されています。
[fruit]
apple.color = "赤"
apple.taste.sweet = true
# [fruit.apple] # 不正
# [fruit.apple.taste] # 不正
[fruit.apple.texture] # サブテーブルを追加できます
smooth = true
インラインテーブル#
インラインテーブルは、テーブルを表現するためのよりコンパクトな構文を提供します。
これは、そうでなければ非常に冗長なグループデータに特に便利です。
インラインテーブルは、波括弧 {
と }
の間に完全に定義されます。
括弧内には、0 個以上のカンマで区切られたキーと値のペアが現れることができます。
キーと値のペアは、標準テーブルのキーと値のペアと同じ形式を取ります。
どのような型の値も含めることができ、インラインテーブルも含まれます。
インラインテーブルは同じ行内に存在する必要があります。
インラインテーブル内では、最後のキーと値のペアの後に終端カンマ(尾カンマ)を付けることは許可されません。
括弧内に改行を含めることは許可されません。
それでも、インラインテーブルを複数行にわたって作成することは強く推奨されません。
本当に必要な場合は、標準テーブルを使用するべきです。
name = { first = "Tom", last = "Preston-Werner" }
point = { x = 1, y = 2 }
animal = { type.name = "パグ" }
上記のインラインテーブルは、以下の標準テーブル定義に相当します:
[name]
first = "Tom"
last = "Preston-Werner"
[point]
x = 1
y = 2
[animal]
type.name = "パグ"
インラインテーブルは独立しており、内部で全てのキーとサブテーブルを定義します。
括弧の外でキーやサブテーブルを追加することはできません。
[product]
type = { name = "釘" }
# type.edible = false # 不正
同様に、インラインテーブルは、すでに定義されたテーブルにキーやサブテーブルを追加するために使用することはできません。
[product]
type.name = "釘"
# type = { edible = false } # 不正
テーブル配列#
最後に説明していない構文は、テーブル配列を書くことを許可します。
これは、テーブル名を二重角括弧で囲むことで表現されます。
テーブルヘッダーの最初の例は、この配列とその最初のテーブル要素を定義し、その後の各例は、その配列内に新しいテーブル要素を作成し、定義します。
これらのテーブルは、出現順に配列に挿入されます。
[[products]]
name = "ハンマー"
sku = 738594937
[[products]] # 配列内の空のテーブル
[[products]]
name = "釘"
sku = 284758393
color = "灰色"
JSON の以下の構造に相当します。
{
"products": [
{ "name": "ハンマー", "sku": 738594937 },
{ },
{ "name": "釘", "sku": 284758393, "color": "灰色" }
]
}
テーブル配列への参照は、最近定義されたテーブル要素を指します。
これにより、最近のテーブル内にサブテーブルやサブテーブル配列を定義することができます。
[[fruits]]
name = "リンゴ"
[fruits.physical] # サブテーブル
color = "赤"
shape = "丸い"
[[fruits.varieties]] # ネストされたテーブル配列
name = "赤美味"
[[fruits.varieties]]
name = "グラニースミス"
[[fruits]]
name = "バナナ"
[[fruits.varieties]]
name = "プランテイン"
上記の TOML は、以下の JSON 構造に相当します。
{
"fruits": [
{
"name": "リンゴ",
"physical": {
"color": "赤",
"shape": "丸い"
},
"varieties": [
{ "name": "赤美味" },
{ "name": "グラニースミス" }
]
},
{
"name": "バナナ",
"varieties": [
{ "name": "プランテイン" }
]
}
]
}
テーブルまたはテーブル配列の親が配列要素である場合、その要素は子要素を定義する前に定義されている必要があります。
順序を逆にする行為は、解析時にエラーをスローする必要があります。
# 不正な TOML ドキュメント
[fruit.physical] # サブテーブルですが、どの親要素に属するべきですか?
color = "赤"
shape = "丸い"
[[fruit]] # パーサーは「fruit」が配列であることを発見したときにエラーをスローする必要があります
name = "リンゴ"
静的に定義された配列に内容を追加しようとすると、配列が空であっても、解析時にエラーをスローする必要があります。
# 不正な TOML ドキュメント
fruits = []
[[fruits]] # 許可されません
すでに配列として定義されている名前でテーブルを定義しようとすると、解析時にエラーをスローする必要があります。
配列を通常のテーブルとして再定義する行為も、解析時にエラーをスローする必要があります。
# 不正な TOML ドキュメント
[[fruits]]
name = "リンゴ"
[[fruits.varieties]]
name = "赤美味"
# 不正:このテーブルは以前のテーブル配列と衝突します
[fruits.varieties]
name = "グラニースミス"
[fruits.physical]
color = "赤"
shape = "丸い"
# 不正:このテーブル配列は以前のテーブルと衝突します
[[fruits.physical]]
color = "緑"
インラインテーブルも適切に使用できます:
points = [ { x = 1, y = 2, z = 3 },
{ x = 7, y = 8, z = 9 },
{ x = 2, y = 4, z = 8 } ]
ファイル拡張子#
TOML ファイルは .toml
拡張子を使用するべきです。
MIME タイプ#
インターネットで TOML ファイルを転送する際、適切な MIME タイプは application/toml
です。
ABNF 文法#
TOML 文法の厳密な説明は、別の ABNF ファイル で提供されています。