2011-10-24 36 views
7

lớp của tôi là:Cập nhật một file YAML trong Ruby

class Mycfg 
    @@options = {} 

    def init 
     @@options = YAML.load_file(Dir.pwd + PATH) 
    end 

    def set(key, val) 
     @@options[key] = val 
    end 

    def get(key) 
     @@options[key] 
    end 

    def save 
    end 
end 

Sử dụng lớp này:

oj = Mycfg.new 
oj.init 

if oj.get 'name' == 'tom' 
    oj.set 'changed', Data.now 
end 

oj.save 

file YAML:

name : tom 
pawd : 123456 
version : 0.0.1 
created : 2011-10-24 
changed : 2011-10-24 

Làm thế nào để tôi hoàn thành phương pháp save để cập nhật tệp YAML nếu có gì đó đã thay đổi?

+1

Bạn nên lưu vào bộ nhớ cache giá trị ban đầu của hàm băm. Sau đó, vào cuối chương trình kiểm tra xem nó có bằng với các tùy chọn @@ hiện tại hay không. Nếu vậy thì xóa tập tin yaml cũ và có ruby ​​ghi ra hàm băm to_yaml từ đầu. Nếu bạn muốn xem đây là một ví dụ, tôi sẽ sẵn sàng bắt buộc. –

+0

Chúng tôi có thể thêm một @@ copy_options cho lớp này để lưu bộ nhớ cache thay đổi, điểm là tôi không biết làm thế nào để lưu dữ liệu vào tập tin yaml. – coolesting

Trả lời

11

Đó là một lớp lót.

w+ cắt ngắn tệp thành 0-length và ghi như thể đó là tệp mới.

options_hash là giá trị hiện tại của @@options.

Bạn sẽ cần getter/accessor để truy xuất toàn bộ băm. Nếu bạn đã thực hiện @@options biến mẫu thay vì biến lớp, bạn có thể chỉ cần thực hiện attr_accessor :options và sau đó truy xuất biến đó với oj.options.

File.open(Dir.pwd + PATH, 'w+') {|f| f.write(options_hash.to_yaml) } 
+1

'File.open (Dir.pwd + PATH, 'w +') {| f | f.write (YAML :: dump (@@ options))} ' nó hoạt động với tôi, và nó không thể tìm thấy' options_hash' – coolesting