Tôi muốn có thể viết một lambda/Proc trong mã Ruby của tôi, serialize nó để tôi có thể ghi nó vào đĩa, và sau đó thực hiện lambda sau này. Loại giống như ...Làm thế nào để bạn stringize/serialize mã Ruby?
x = 40
f = lambda { |y| x + y }
save_for_later(f)
Sau đó, trong một hoạt động riêng biệt của thông dịch viên Ruby, tôi muốn để có thể nói ...
f = load_from_before
z = f.call(2)
z.should == 42
Marshal.dump không làm việc cho Procs. Tôi biết Perl có Data::Dump::Streamer, và trong Lisp này là tầm thường. Nhưng có cách nào để làm điều đó trong Ruby? Nói cách khác, việc triển khai save
là gì?_
cho _
sau
Chỉnh sửa: My answer below là tốt, nhưng không đóng các biến miễn phí (như x
) và tuần tự hóa chúng cùng với lambda. Vì vậy, trong ví dụ của tôi ...
x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n (x + y)\n}"
... đầu ra chuỗi không bao gồm định nghĩa cho x
. Có một giải pháp mà đưa này vào tài khoản, có lẽ bằng cách serializing bảng biểu tượng? Bạn có thể truy cập nó trong Ruby không?
Chỉnh sửa 2: Tôi đã cập nhật câu trả lời của mình để kết hợp các biến cục bộ. Điều này có vẻ chấp nhận được.
Phiên bản Ruby2Ruby của tôi (1.2.4) dường như không có phương thức dịch. Có một api khác cho điều này trong các phiên bản mới hơn không? –
Tôi không hiểu lắm, nhưng [chủ đề này] (http://stackoverflow.com/questions/1144906/error-running-heckle-currentcode-undefined-method-translate-for-ruby2ruby) khuyến nghị hạ cấp xuống Ruby2Ruby 1.2 .2. Tôi cũng tìm thấy [bản vá khỉ này] (http://gist.github.com/321038) mà yêu cầu thêm nó trở lại các phiên bản sau này. Đã không thử nó mặc dù. –
Nó hút rằng nó không hoạt động với Ruby 1.9 ... – Kludge