Ruby kodumda bir lambda/Proc yazabilmek, serileştirebilmek için serileştirmek ve sonra lambda daha sonra çalıştırmak istiyorum. Ruby kodunu nasıl dizgeleştirir/serileştirirsiniz?
x = 40
f = lambda { |y| x + y }
save_for_later(f)
Daha sonra Yakut tercüman ayrı vadede, söyleyecek isterler benzeri sırala ... ... Marshal.dump procs için çalışmıyor
f = load_from_before
z = f.call(2)
z.should == 42
. Perl'in Data::Dump::Streamer olduğunu biliyorum ve Lisp'de bu önemsiz. Ama Ruby'de bunu yapmanın bir yolu var mı? Başka bir deyişle, _
için save
_
'un uygulanması ne olurdu?
Düzenleme: My answer below güzel, ama serbest değişkenleri (gibi x
) üzerinden kapatın ve lambda birlikte bunları serileştirmez.
x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n (x + y)\n}"
... benim örnekte Yani ... dize çıkış x
tanımını içermez. Bunu dikkate alan bir çözüm var mı, belki de sembol tablosunu serileştirerek? Buna Ruby'de erişebilir misin?
Edit 2: Serileştiren yerel değişkenleri dahil etmek için yanıtımı güncelleştirdim. Bu kabul edilebilir görünüyor.
Ruby2Ruby (1.2.4) 'ün bir versiyonunun çeviri yöntemi yok gibi görünüyor. Daha yeni versiyonlarda bunun için farklı bir api var mı? –
Oldukça anlamıyorum, ama [bu konu] (http://stackoverflow.com/questions/1144906/error-running-heckle-currentcode-undefined-method-translate-for-ruby2ruby) Ruby2Ruby 1.2'ye geçişi öneriyor 0,2. Ayrıca, daha sonraki sürümlerine eklediğini iddia eden [bu maymun yamaunu] (http://gist.github.com/321038) de buldum. Yine de denemedim. –
Bunun yerine Ruby 1.9 ... – Kludge