2015-08-25 3 views
5

में एक वर्ग पर काम करता है मुझे लगता है कि मैंकैसे [] रूबी

Dir["*"] 

का उपयोग करना कैसे मैं बिल्कुल कि वाक्य रचना को पढ़ने के लिए चाहिए एक निर्देशिका में फ़ाइलों की एक सूची प्राप्त कर सकते हैं? जैसा कि मुझे पता है कि आप किसी सरणी या हैश से मान लाने के लिए [] का उपयोग कर सकते हैं।

[] कॉल पर कैसे काम करता है?

+3

अपनी बस वाक्यात्मक चीनी, 'Dir.glob के लिए एक उपनाम की तरह लग रहा ([स्ट्रिंग, ...], 0)' http://ruby-doc.org/core-2.2.0/Dir.html –

+2

[Dir :: [\]] (http://ruby-doc.org/core-2.2.0/Dir.html#method-c- 5 बी -5 डी) एक बगीचे-विविध विधि है। इसे अपनी कक्षा में परिभाषित करने के लिए: 'कक्षा ए; def [] (अन्य); दूसरे रखता है; समाप्त; समाप्त; एनी ['बिल्ली'] => "बिल्ली" '। –

+3

आपके दूसरे बिंदु के लिए -> http://stackoverflow.com/questions/13767240/ruby-how-to-make-a-public-static-method –

उत्तर

4

Ruby Docs से Dir["*"]Dir.glob(["*"]) के बराबर है। (जैसा कि ने कहा, यह syntactic sugar है)

Dir एक फोन नहीं है, यह एक वर्ग है, और class Dir की वस्तुओं निर्देशिका धाराओं, आप एक सरणी की तरह का उपयोग जो कर रहे हैं।

आपके विशिष्ट मामले में, Dir["*"]Dir[patternString] के रूप में पारित पैटर्न से मिले फ़ाइल नामों के array लौटाएगा। "*" एक पैटर्न के रूप में शून्य या अधिक वर्णों से मेल खाता है, दूसरे शब्दों में, यह सब कुछ मेल खाता है, और इस प्रकार उस निर्देशिका में सभी फ़ाइल नामों के array लौटाएगा।

अपने दूसरे प्रश्न के लिए, आप तो बस define it as any other method की तरह कर सकते हैं:

class YourClass 
    def self.[](v) 
    #your code here 
    end 
end 
+0

धन्यवाद, हाँ, यह इसे साफ़ कर दिया गया। मैंने अपना प्रश्न अपडेट किया है। इसके दूसरे भाग के किसी भी विचार? –

+0

@cremno, आप सही हैं, यह इंगित करने के लिए धन्यवाद, मैं – Parker

+0

अपडेट करूंगा @PrakashRaman मैंने फिर से प्रश्न को अद्यतन किया है कि आपने दूसरा प्रश्न दोहराया :) – Parker

5

[] बस एक विधि, #to_s की तरह, #object_id है। आदि

आप किसी भी वस्तु पर इसे परिभाषित कर सकते हैं:

class CoolClass 
    def [](v) 
    puts "hello #{v}" 
    end 
end 

CoolClass.new["John"] # => "hello John" 

आपके मामले में यह इस तरह से, सिंगलटन पद्धति के रूप में परिभाषित किया है:

class Dir 
    def self.[](v) 
    ... 
    end 
end 
2

विधि Dir::glob एक तर्क लेता है, और प्रदान करता है तर्क के तहत घोंसला वाली सभी निर्देशिकाओं की एक श्रृंखला और फ़ाइलें। (वहां से, आप [0] के साथ सरणी के सूचकांक को पकड़ सकते हैं।) तर्क में झंडे के साथ मिलान करने के लिए एक पैटर्न शामिल हो सकता है। तर्क (पैटर्न, झंडे) विकल्प समान (लेकिन वास्तव में नहीं) नियमित अभिव्यक्ति हो सकते हैं।

पैटर्न के एक जोड़े सहित डॉक्स, से/झंडे कि आपकी रुचि का हो सकता है:

ध्यान दें कि यह पैटर्न एक regexp नहीं है, यह एक खोल ग्लोब के करीब है। झंडे पैरामीटर के अर्थ के लिए File.fnmatch देखें। ध्यान दें कि केस संवेदनशीलता आपके सिस्टम पर निर्भर करती है (इसलिए File::FNM_CASEFOLD अनदेखा किया जाता है), जैसा कि परिणाम लौटाया जाता है।

  • * - किसी भी फ़ाइल से मेल खाता है। ग्लोब में अन्य मूल्यों से प्रतिबंधित किया जा सकता है। Regexp में / .* /x के बराबर।
  • [set] - सेट में किसी एक चरित्र से मेल खाता है। सेट नकारात्मक ([^a-z]) सहित Regexp में चरित्र सेट की तरह व्यवहार करता है।

Dir::glob() की आशुलिपि Dir[], हालांकि मैं लंबे समय से फार्म पसंद करते है। जैसा कि आपने उपरोक्त देखा है, ब्रैकेट का उपयोग तर्क के लिए एक विशेष पैटर्न/ध्वज को दर्शाता है। यहाँ (डॉक्स से) कुछ उदाहरण हैं कि बेहतर यह समझा जा सकता है:

Dir["config.?"]      #=> ["config.h"] 
Dir.glob("config.?")    #=> ["config.h"] 
Dir.glob("*.[a-z][a-z]")   #=> ["main.rb"] 
Dir.glob("*")      #=> ["config.h", "main.rb"] 

यह आप Dir के लिए [] विधि को फिर से परिभाषित करने के लिए संभव है, लेकिन मुझे नहीं पता चलेगा कि - कई (और अपने आप) नहीं है बंदर-पैचिंग कोर रूबी कक्षाओं और मॉड्यूल की सिफारिश करें। हालांकि, आप अपनी खुद की कक्षा में विधि बना सकते हैं। निम्नलिखित देखें:

class User 
    # Class method => User.new[arg] 
    def self.[](arg) 
    end 

    # Instance method => @user[arg] 
    def [](arg) 
    end 
end 
1

Dir किसी भी अन्य वस्तु की तरह एक वस्तु है (यह सिर्फ वर्ग Class का एक उदाहरण भी है), और [] किसी भी अन्य विधि की तरह एक विधि है (यह सिर्फ एक है करने के लिए होता है हास्यास्पद नाम, और विशेष वाक्य रचनात्मक सुविधाएं जो इसे सामान्य के अलावा एक अलग वाक्यविन्यास का उपयोग करने की अनुमति देती हैं)।

तो, आप यह सिर्फ किसी भी अन्य विधि की तरह परिभाषित करते हैं:

class MyClass 
    def self.[](*) end 
end