2013-08-15 4 views
16

क्या निम्नलिखित कोड को सरल बनाने का कोई तरीका है?रूबी विधि को ब्लॉक में कैसे चालू करें?

फ़ाइल नाम फ़ाइल नामों (तारों) की एक सूची है, उदा। [ "Foo.txt", "bar.c", "baz.yaml"]

filenames.map { |f| File.size(f) } 

वहाँ किसी भी तरह से "File.size" बारी एक proc में या ब्लॉक करने के लिए है? मौजूदा वस्तुओं पर विधियों के लिए, मैं &:method कर सकता हूं। क्या मॉड्यूल स्तर के तरीकों के लिए कुछ समान है?

उत्तर

22

आप Object#method(method_name) उपयोग कर सकते हैं (हालांकि AFAIK मुहावरेदार नहीं है):

filenames.map(&File.method(:size)) 
+0

हाँ .. यह वह है जिसे मैं देने वाला था .. लेकिन तुमने मुझे हराया .. यह प्रस्तुत करने के लिए धन्यवाद .. * + 1 *। –

+0

दिलचस्प, मैं '&' के बाध्यकारी क्रम के बारे में गलत अनुमान लगाता। – DGM

4
filesize = proc { |f| File.size(f) } 
filenames.map(&filesize) 
+0

+1 बहुत शांत। मैंने ऐसा करने का विचार क्यों नहीं किया? अब मेरे पास एक महान नई रिफैक्टरिंग चाल है। –

+4

यह इसे सरल नहीं बनाता है, यह अतिरिक्त जटिलता जोड़ता है। –

+2

@ मार्टिनसी। मार्टिन वास्तव में, यह इसे सरल नहीं बनाता है। लेकिन यह वही है जो आपने पूछा था। यह उत्तर अभिव्यक्ति को एक प्रो में बहुत आसानी से बदल देता है। स्वयं पर आरोप लगाएं। यह आपकी गलती है, न कि लोगान। – sawa

4

Stdlib के Pathname फाइलों और निर्देशिकाओं पर एक और अधिक वस्तु उन्मुख दृष्टिकोण प्रदान करता है। शायद आपके filelist को दोबारा करने का एक तरीका है, उदा। के बजाय:

filenames = Dir.entries(".") 
filenames.map { |f| File.size(f) } 

आप का प्रयोग करेंगे:

require 'pathname' 
filenames = Pathname.new(".").entries 
filenames.map(&:size) 
+2

धन्यवाद, यह मेरी वास्तविक समस्या हल करता है, हालांकि यह प्रश्न के शीर्षक का जवाब नहीं देता है। –

संबंधित मुद्दे