2010-09-16 25 views
5

Tôi đang cố gắng sửa đổi cách xóa mặc định của định dạng dấu thời gian dựng sẵn, để ảnh hưởng đến Thời gian của Ruby.Ruby YAML :: tải

Tôi làm điều này (thành công) với Hash:

YAML::add_domain_type('yaml.org,2002', 'map') { |t, v| nil } 
YAML::add_domain_type('ruby.yaml.org,2002', 'hash') { |t, v| nil } 
hash = { :hello => :world } 
puts YAML::load(hash.to_yaml) # nil 

Nhưng khi tôi cố gắng cùng với thời gian, nó không hoạt động:

YAML::add_domain_type('yaml.org,2002', 'timestamp') { |t, v| nil } 
YAML::add_domain_type('ruby.yaml.org,2002', 'time') { |t, v| nil } 
puts YAML::load(Time.now.to_yaml).class # 'Time' 

Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn!

+0

Tôi không chắc chắn nếu nó liên quan, nhưng YAML được không khứ hồi đối tượng Thời gian theo http://redmine.ruby-lang.org/issues/show/4005 –

+0

mục đích của dòng đầu tiên là gì, 'YAML :: add_domain_type ('yaml.org, 2002', 'map') {| t, v | nil} 'bởi vì nếu bạn loại bỏ điều đó, hàm băm cũng không hoạt động. – stephenr

+0

Tham chiếu cho [YAML :: add_domain_type] (http://yaml4r.sourceforge.net/doc/class/yaml_add_domain_type_method.htm). –

Trả lời

2

Nếu bạn đang sử dụng Psych (đó là YAML trong ruby ​​1.9.3p194) thì bạn cần xác định phương thức encode_with/1 trên lớp Thời gian.

require 'yaml' 

class Time 
    def encode_with(coder) 
    coder.tag = '!ruby/time' 
    coder.scalar = to_s 
    end 
end 

YAML::add_domain_type('ruby.yaml.org,2002', 'ruby/time') { |t, v| "HELLO!!" } 

yaml = YAML.dump(Time.new) # -> "--- !ruby/time 2012-10-25 14:18:59 -0400\n...\n" 
YAML.load(yaml) # -> "HELLO!!" 

Nếu phương pháp encode_with/1 được xác định trên đối tượng sau đó Psych gọi là phương pháp đi qua trong một thể hiện của lớp Psych::Coder; nếu không, nó gọi phương thức visit_#{o.class} trong lớp YAMLTree, trong trường hợp visit_Time không tuần tự hóa bất kỳ thông tin thẻ nào.

https://github.com/tenderlove/psych/blob/master/lib/psych/visitors/yaml_tree.rb#l100-105

https://github.com/tenderlove/psych/blob/master/lib/psych/visitors/yaml_tree.rb#l172-175