相关疑难解决方法(0)

你如何串行化/序列化Ruby代码?

我希望能够在我的Ruby代码中编写lambda/Proc,将其序列化以便我可以将其写入磁盘,然后再执行lambda.有点像......

x = 40
f = lambda { |y| x + y }
save_for_later(f)
Run Code Online (Sandbox Code Playgroud)

后来,在另一个Ruby解释器的运行中,我想能够说...

f = load_from_before
z = f.call(2)
z.should == 42
Run Code Online (Sandbox Code Playgroud)

Marshal.dump不适用于Procs.我知道Perl有Data :: Dump :: Streamer,而在Lisp中这是微不足道的.但有没有办法在Ruby中做到这一点?换句话说,实施什么?save_for_later

编辑:我的答案很好,但它不会关闭自由变量(如x)并将它们与lambda序列化.所以在我的例子中......

x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n  (x + y)\n}"
Run Code Online (Sandbox Code Playgroud)

...字符串输出不包含的定义x.是否有一个解决方案考虑到这一点,可能是通过序列化符号表?你可以在Ruby中访问它吗?

编辑2:我更新了我的答案,以结合序列化局部变量.这似乎可以接受.

ruby lambda serialization proc-object

16
推荐指数
2
解决办法
6870
查看次数

TypeError(没有为类Proc定义_dump_data):

我正在尝试使用rails应用程序中的以下代码在会话中存储值

session[:key] = value 
Run Code Online (Sandbox Code Playgroud)

我得到以下错误

TypeError (no _dump_data is defined for class Proc):
activesupport (3.2.9) lib/active_support/message_verifier.rb:53:in `dump'
 activesupport (3.2.9) lib/active_support/message_verifier.rb:53:in `generate'
 actionpack (3.2.9) lib/action_dispatch/middleware/cookies.rb:300:in `[]='
actionpack (3.2.9) lib/action_dispatch/middleware/session/cookie_store.rb:67:in    `set_cookie'
rack (1.4.1) lib/rack/session/abstract/id.rb:330:in `commit_session'
rack (1.4.1) lib/rack/session/abstract/id.rb:206:in `context'
rack (1.4.1) lib/rack/session/abstract/id.rb:200:in `call'
actionpack (3.2.9) lib/action_dispatch/middleware/cookies.rb:341:in `call'
activerecord (3.2.9) lib/active_record/query_cache.rb:64:in `call'
activerecord (3.2.9)    lib/active_record/connection_adapters/abstract/connection_pool.rb:479:in `call'
actionpack (3.2.9) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
activesupport (3.2.9) lib/active_support/callbacks.rb:405:in `
Run Code Online (Sandbox Code Playgroud)

任何帮助都非常感谢.

ruby-on-rails ruby-on-rails-3

11
推荐指数
2
解决办法
5839
查看次数