当前位置:  开发笔记 > 后端 > 正文

如何在Ruby中编组lambda(Proc)?

如何解决《如何在Ruby中编组lambda(Proc)?》经验,为你挑选了2个好方法。

Joe Van Dyk 询问了Ruby邮件列表:

嗨,

在Ruby中,我猜你不能编组一个lambda/proc对象,对吗?在lisp或其他语言中这可能吗?

我想做什么:

l = lamda { ... }
Bj.submit "/path/to/ruby/program", :stdin => Marshal.dump(l)

所以,我正在向BackgroundJob发送一个lambda对象,该对象包含要执行的操作的上下文/代码.但是,猜测这是不可能的.我最终编组了一个普通的ruby对象,其中包含程序运行后要执行的操作的说明.

ryantm.. 21

你不能编组Lambda或Proc.这是因为它们都被认为是闭包,这意味着它们靠近定义它们的内存并且可以引用它.(为了编组它们,你必须将它们在创建时可以访问的所有内存编组.)

正如Gaius指出的那样,你可以使用ruby2ruby来获取程序的字符串.也就是说,您可以封送代表ruby代码的字符串,然后再重新评估它.



1> ryantm..:

你不能编组Lambda或Proc.这是因为它们都被认为是闭包,这意味着它们靠近定义它们的内存并且可以引用它.(为了编组它们,你必须将它们在创建时可以访问的所有内存编组.)

正如Gaius指出的那样,你可以使用ruby2ruby来获取程序的字符串.也就是说,您可以封送代表ruby代码的字符串,然后再重新评估它.


ruby2ruby仅适用于1.8,还没有正式的方法来反序列化1.9的字节码.

2> dominic..:

你也可以输入你的代码作为字符串:

code = %{
    lambda {"hello ruby code".split(" ").each{|e| puts e + "!"}}
}

然后用eval执行它

eval code

这将返回红宝石lamda.

使用%{}格式转义字符串,但仅在不匹配的括号上关闭.即你可以像这样嵌套大括号%{ [] {} },它仍然是封闭的.

大多数文本语法荧光笔没有意识到这是一个字符串,所以仍然显示常规代码突出显示.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有