2008-08-23 21 views
18

जो वान डाइक asked the Ruby mailing list:मैं एक लैम्ब्डा रूबी में (प्रोक) कैसे मार्शल करते हैं?

हाय,

रूबी में, मुझे लगता है कि आप सही एक लैम्ब्डा/proc वस्तु मार्शल नहीं कर सकते? संभव कि तुतलाना या अन्य भाषाओं में है?

मैं क्या करने की कोशिश कर रहा था क्या:

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

तो, मैं BackgroundJob भेज रहा एक लैम्ब्डा वस्तु है, जो कि क्या करना है के लिए संदर्भ/कोड है। लेकिन, अनुमान लगाओ कि संभव नहीं था। मैं एक सामान्य गहरे लाल रंग का उद्देश्य यह है कि निर्देश के बाद कार्यक्रम भाग गया कि क्या करना है के लिए निहित प्रमुखता समाप्त हो गया।

जो

उत्तर

20

आप एक लैम्ब्डा या प्रोक मार्शल नहीं कर सकते हैं की कोशिश करो। ऐसा इसलिए है क्योंकि उनमें से दोनों को बंद माना जाता है, जिसका अर्थ है कि वे उस स्मृति के चारों ओर बंद होते हैं जिस पर उन्हें परिभाषित किया गया था और इसका संदर्भ दे सकता है। (उन्हें मार्शल करने के लिए आपको उन सभी मेमोरी को मार्शल करना होगा जब वे बनाए गए थे।)

जैसा कि गैयस ने बताया, आप ruby2ruby का उपयोग कर स्ट्रिंग को पकड़ने के लिए उपयोग कर सकते हैं कार्यक्रम। यही है, आप उस स्ट्रिंग को मार्शल कर सकते हैं जो रूबी कोड का प्रतिनिधित्व करता है और फिर बाद में इसका पुनर्मूल्यांकन करता है।

+3

ruby2ruby केवल 1.8 पर काम करता है, वहाँ अभी तक 1.9 की बाईटकोड deserialize करने के लिए कोई आधिकारिक तरीका है। – manveru

+0

मैंने कुछ प्रोजेक्ट का उपयोग "रिपर" को 1.9 से पहले देखा है ... बहुत आसान नहीं लग रहा था ... – rogerdpack

+1

रूबी 2 आरबी कुछ समय के लिए एमआरआई 1.9 में काम कर रहा है। रिपर भी ठंडा है और यह एमआरआई (1.9 के बाद से) के साथ आता है। –

4

आप Ruby2Ruby का उपयोग कर रूबी कोड की एक स्ट्रिंग संस्करण प्राप्त करने में रुचि रखते हैं, तो आप this thread पसंद कर सकते हैं।

11

आप भी सिर्फ एक स्ट्रिंग के रूप में अपने कोड में प्रवेश कर सकता:

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

तो eval

eval code 

जो एक गहरे लाल रंग का lamda वापस आ जाएगी साथ निष्पादित।

%{} प्रारूप का उपयोग कर एक स्ट्रिंग से बच निकलता है, लेकिन केवल एक बेजोड़ ब्रेस पर बंद हो जाता है। यानी आप घोंसला कर सकते हैं इस %{ [] {} } तरह धनुकोष्ठक और यह अभी भी संलग्न है।

सबसे पाठ वाक्य रचना हाइलाइटर का एहसास नहीं है यह एक स्ट्रिंग है, इसलिए अभी भी नियमित रूप से कोड हाइलाइटिंग प्रदर्शित करते हैं।

0

मुझे proc_to_ast सबसे अच्छा काम करने के लिए मिला है: https://github.com/joker1007/proc_to_ast। गहरे लाल रंग का 2 + में पक्का

काम करता है, और मैं गहरे लाल रंग का 1.9.3+ संगतता के लिए एक जनसंपर्क बना लिया है (https://github.com/joker1007/proc_to_ast/pull/3)

0

proc एक फ़ाइल में परिभाषित किया गया है, तो यू proc के फ़ाइल स्थान तो प्राप्त कर सकते हैं इसे क्रमबद्ध करने के बाद, फिर से प्रोसेस पर वापस जाने के लिए स्थान का उपयोग करने के बाद

proc_location_array = proc।source_location

deserialize के बाद:

file_name = proc_location_array [0]

line_number = proc_location_array [1]

proc_line_code = IO.readlines (FILE_NAME) [LINE_NUMBER - 1]

proc_hash_string = proc_line_code [proc_line_code.index ("{") .. proc_line_code.length]

proc = eval ("लैम्ब्डा # {proc_hash_string}")