2012-12-09 13 views
7

Piszę mieszanie Ruby do pliku przy użyciu YAML.Dlaczego łańcuchy zaczynają się od spacji przekonwertowanej za pomocą:! "z Ruby/YAML

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

Hash zawiera ciągi jako klucze i pływa jako wartości.

Kiedy moje struny zawierać tylko litery są wyprowadzane jako takie w Plik:

abc: 1.0 
bcd: 1.0 
cde: 1.0 

Kiedy łańcuch zaczyna się przestrzeń jest podawanych jako takie:

! ' ab': 1.0 

Kiedy czytam plik z powrotem ponownie wszystko jest ok, ale chcę wiedzieć, dlaczego tak się dzieje i co to znaczy.

Przeszukałem dokumentację YAML i podano, że pojedynczy wykrzyknik jest używany do reprezentowania lokalnych typów danych.

Dlaczego tak się dzieje w przypadku łańcucha zaczynającego się od spacji?

Odpowiedz

5

The ! is known as the "non-specific tag". Zmusza mechanizm YAML do dekodowania następującego elementu jako łańcucha, skrótu lub tablicy. Zasadniczo wyłącza interpretowanie go jako innego typu. Nie jestem pewien, dlaczego silnik tak je taguje; to nie wydaje się być potrzebne. Być może jest to po prostu nadgorliwe próby usunięcia niejasności?

Edit: albo inaczej, jest to niepotrzebne składnia:

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

myślę że potrzebuje ciąg być w cudzysłowie, aby potwierdzić przestrzeń jest częścią łańcucha. Sprawdziłem również specyfikację bardziej i znalazłem w sekcji: "Przykład 7.8. Pojedynczo cytowane klucze niejawne", że: "Wszystkie wiodące i końcowe znaki białe spacje są wykluczone z zawartości.". Nie jestem pewien, ale myślę, że może trzeba użyć! aby zapobiec usunięciu wiodącej białej powierzchni? – Gilles

+1

Początkowe i końcowe białe znaki, do których się odnosi, są przed i po cudzysłowach. Można pokazać, że '!' Jest niepotrzebne przez jego edycję i przeładowanie yaml, które ładuje dokładnie to samo bez '!' –

Powiązane problemy