2012-12-09 6 views
7

Tôi đang viết một băm Ruby vào một tập tin bằng YAML.Tại sao chuỗi bắt đầu bằng khoảng trắng được chuyển đổi bằng:! 'với Ruby/YAML

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

Hàm băm chứa chuỗi là khóa và nổi dưới dạng giá trị.

Khi chuỗi của tôi chỉ chứa thư họ đang outputted như vậy trong file file:

abc: 1.0 
bcd: 1.0 
cde: 1.0 

Khi một chuỗi bắt đầu với một không gian nó được xuất ra như vậy:

! ' ab': 1.0 

Khi tôi đọc các tập tin trở lại trong một lần nữa tất cả mọi thứ là ok, nhưng tôi muốn biết tại sao điều này xảy ra và những gì nó có nghĩa là.

Tôi đã tìm kiếm tài liệu YAML và nói rằng một dấu chấm than đơn được sử dụng để biểu diễn các kiểu dữ liệu cục bộ.

Tại sao điều này xảy ra trên chuỗi bắt đầu bằng dấu cách?

Trả lời

5

! is known as the "non-specific tag". Nó buộc động cơ YAML giải mã mục sau đây dưới dạng chuỗi, băm hoặc mảng. Về cơ bản nó vô hiệu hóa việc giải thích nó như một kiểu khác. Tôi không chắc tại sao động cơ lại gắn thẻ cho họ theo cách này; nó dường như không cần thiết. Có lẽ nó chỉ là cố gắng hết sức để loại bỏ sự mơ hồ?

Edit: một trong hai cách, đó là cú pháp không cần thiết:

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

Tôi nghĩ nó cần chuỗi là trong dấu ngoặc kép để xác nhận không gian là một phần của chuỗi. Tôi cũng đã kiểm tra thông số kỹ thuật hơn và tìm thấy trong phần: "Ví dụ 7.8. Các phím ẩn được trích dẫn một lần" đề cập đến: "Tất cả ký tự dấu cách trắng ở đầu và cuối được loại trừ khỏi nội dung.". Tôi không chắc chắn, nhưng tôi nghĩ rằng nó có thể cần phải sử dụng! thế nào để ngăn không gian trắng bị xóa? – Gilles

+1

Khoảng trắng đầu và cuối nó đề cập đến là trước và sau dấu ngoặc kép. Có thể thấy rằng '!' Không cần thiết bằng cách chỉnh sửa nó, và tải lại yaml, tải chính xác như nhau mà không có '!' –