2011-09-24 14 views
9

मैं सोच रहा था कि File लाइब्रेरी लिखने वाले लोगों ने तर्क देने का फैसला किया कि यह निर्धारित करता है कि प्रतीक के बजाय तारों में फ़ाइल किस प्रकार खोला गया है।स्ट्रिंग के बजाय फ़ाइल.न्यू प्रतीकों के तर्क क्यों नहीं हैं?

उदाहरण के लिए, यह है कि यह कैसे है:

f = File.new('file', 'rw') 

लेकिन यह करने के लिए एक बेहतर डिजाइन नहीं होगा

f = File.new('file', :rw) 

या यहाँ तक कि

f = File.new(:file, :rw) 
उदाहरण के लिए

? यह उनका उपयोग करने के लिए एक आदर्श स्थान प्रतीत होता है क्योंकि तर्क निश्चित रूप से उत्परिवर्तनीय होने की आवश्यकता नहीं है।

मुझे यह जानने में दिलचस्पी है कि यह इस तरह से क्यों आया।


अद्यतन: मैंने अभी a related question about symbols vs. strings पढ़ा है, और मुझे लगता है कि सर्वसम्मति यह थी कि प्रतीकों को स्ट्रिंग के रूप में भी जाना जाता है, और हर किसी को किसी भी तरह से इंडेक्स हैश टेबल पर तारों का उपयोग करने के लिए उपयोग किया जाता है। हालांकि, मुझे नहीं लगता कि यह रूबी के मानक पुस्तकालय के डिजाइनरों के लिए प्रतीकों के विषय पर अज्ञानता की मांग करने के लिए मान्य होगा, इसलिए मुझे नहीं लगता कि यही कारण है।

+5

शायद यह सिर्फ एक ऐतिहासिक आर्टिफैक्ट है जो libc में 'fopen' पर वापस जा रहा है। –

+7

क्या आप सुझाव दे रहे हैं कि 'अनन्य' मोड ('r',' w', '+', 'a',' b', 't') के प्रत्येक मान्य क्रमपरिवर्तन के लिए एक अद्वितीय प्रतीक परिभाषित किया गया हो? – Gabe

+0

महान सवाल। 'फाइल :: आरडीडब्ल्यूआर' और 'फाइल :: CREAT' जैसे स्थिरांक हैं जिनका आप उपयोग कर सकते हैं, लेकिन मुझे इसके बारे में दस्तावेज़ीकरण नहीं मिल रहा है। 'फ़ाइल' [प्रलेखन] (http://www.ruby-doc.org/core/classes/File.html) इन स्थिरांक का उपयोग करता है, लेकिन उन्हें समझा नहींता है। – rdvdijk

उत्तर

2

मैं रूबी के इतिहास में कोई विशेषज्ञ नहीं हूं, लेकिन जब आप किसी विधि के पैरामीटर चाहते हैं तो आपके पास वास्तव में तीन विकल्प होते हैं: तार, प्रतीकों और स्थिर वर्ग।

उदाहरण के लिए, अपवाद हैंडलिंग। प्रत्येक अपवाद वास्तव में कक्षा अपवाद का एक प्रकार है।

ArgumentError.is_a? Class 
=> True 

तो आप स्ट्रीम के लिए प्रत्येक अनुमति अपनी कक्षा हो सकती है। लेकिन इसके लिए सिस्टम के लिए और भी कक्षाएं उत्पन्न की आवश्यकता होगी।

प्रतीकों के बारे में बात यह है कि वे कभी नहीं हटाए जाते हैं। आपके द्वारा उत्पन्न हर प्रतीक अनिश्चित काल तक संरक्षित है; यही कारण है कि '.to_sym' विधि का उपयोग हल्के ढंग से निराश हो जाता है। यह स्मृति रिसाव की ओर जाता है।

स्ट्रिंग्स का उपयोग करना आसान है। यदि आपको उपयोगकर्ता से इनपुट मोड मिला है, तो आपको अपने कोड में कहीं भी '.to_sym' की आवश्यकता होगी, या कम से कम, एक बड़ा स्विच स्टेटमेंट। एक स्ट्रिंग के साथ, आप सीधे उपयोगकर्ता इनपुट को विधि में पास कर सकते हैं (यदि आप निश्चित रूप से भरोसेमंद थे)।

इसके अलावा, सी में, आप फ़ाइल I/o विधि में एक चरित्र पास करते हैं। रूबी में कोई चार्ज नहीं है, बस तार। यह देखकर कि सी पर रूबी कैसे बनाई गई है, यह वह जगह हो सकती है जहां से यह आता है।

1

यह पिछले भाषाओं से बस एक अवशेष है।

+0

मैं असहमत हूं। क्या आप उदाहरणों और रचनाकारों के किसी भी बयान के साथ अपने दावे का बैक अप ले सकते हैं? –

+1

मैं सभी पुरानी भाषाओं के लिए दस्तावेज़ों को देखने के लिए नहीं जा रहा हूं और आपको दिखाता हूं कि वे सभी इस स्ट्रिंग प्रारूप का उपयोग करते हैं, लेकिन यहां एक और वेब भाषा से एक उदाहरण है: http://us3.php.net/manual/en/function .fopen.php – weexpectedTHIS

+0

ठीक है लेकिन PHP ने ऐसा क्यों किया?क्या ऐसा इसलिए है क्योंकि एक भाषा के रूप में PHP तारों के चारों ओर भारी आधारित है? क्या ऐसा इसलिए है क्योंकि PHP पर्ल जैसे प्रतीकों का समर्थन नहीं करता है? क्या ऐसा इसलिए है ...? मुझे क्या मिल रहा है यह है कि आप कोई सबूत नहीं देते कि यह आपकी राय के बजाय एक उत्तर है। –

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

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