2012-12-09 15 views
7

我正在使用YAML爲一個文件寫一個Ruby哈希。爲什麼以空格開頭的字符串轉換爲!! 'with Ruby/YAML

File.open(output_file, "w") {|file| file.puts YAML::dump(final)} 

散列包含字符串作爲鍵和浮點值作爲值。

當我的字符串只包含字母它們在文件file這樣輸出:

abc: 1.0 
bcd: 1.0 
cde: 1.0 

當一個字符串,它就會輸出這樣一個空間開始:

! ' ab': 1.0 

當我讀到該文件再次返回一切正常,但我想知道爲什麼發生這種情況,這是什麼意思。

我搜索了YAML文檔,它說單個感嘆號用於表示本地數據類型。

爲什麼這會發生在以空格開頭的字符串上?

回答

5

! is known as the "non-specific tag"。它強制YAML引擎將以下項目解碼爲字符串,散列或數組。它基本上禁止將其解釋爲不同的類型。我不確定爲什麼引擎會以這種方式標記它們;它似乎並不需要。也許這只是過度試圖消除歧義?

編輯:無論哪種方式,它不需要語法:

YAML.dump({' a'=>0}) 
=> "---\n! ' a': 0\n" 
YAML.load("---\n! ' a': 0\n") # with the bang 
=> {" a"=>0} 
YAML.load("---\n' a': 0\n") # without the bang 
=> {" a"=>0} 
+0

我想它需要的字符串,引號內確認的空間是字符串的一部分。我還檢查了更多規範,並在部分中找到:「例7.8。單引號隱式鍵」提到:「所有前導和尾隨空白字符都不包含在內容中。」。我不確定,但我認爲它可能需要使用!防止刪除主要的空白空間? – Gilles

+1

引用的前導和尾隨空格在引號前後。可以通過編輯它來顯示'!'是不需要的,並且重新加載yaml,該加載完全相同,而不用'!' –

相關問題