रूबी में, $stdout
(डॉलर चिह्न से पहले) और STDOUT
(सभी कैप्स में) के बीच क्या अंतर है ? आउटपुट पुनर्निर्देशन करते समय, जिसका उपयोग किया जाना चाहिए और क्यों? उसी के लिए चला जाता है $stderr
और STDERR
।
संपादित करें: बस एक संबंधित प्रश्न पाया ।
रूबी में, $stdout
(डॉलर चिह्न से पहले) और STDOUT
(सभी कैप्स में) के बीच क्या अंतर है ? आउटपुट पुनर्निर्देशन करते समय, जिसका उपयोग किया जाना चाहिए और क्यों? उसी के लिए चला जाता है $stderr
और STDERR
।
संपादित करें: बस एक संबंधित प्रश्न पाया ।
$stdout
और STDOUT
बनाम $stdin
और STDIN
सममित हैं, बीच $stdout
और $>
बनाम के अंतर $stdin
और $<
नहीं हैं।
जवाबों:
$stdout
एक वैश्विक चर है जो वर्तमान मानक आउटपुट का प्रतिनिधित्व करता है। मानक आउटपुट STDOUT
का एक निरंतर प्रतिनिधित्व है और आमतौर पर इसका डिफ़ॉल्ट मान है $stdout
।
STDOUT
एक स्थिर होने के साथ , आपको इसे फिर से परिभाषित नहीं करना चाहिए, हालांकि, आप $stdout
त्रुटियों / चेतावनियों के बिना फिर से परिभाषित कर सकते हैं (पुनः परिभाषित STDOUT
एक चेतावनी बढ़ाएगा)। उदाहरण के लिए, आप कर सकते हैं:
$stdout = STDERR
उसी के लिए चला जाता है $stderr
औरSTDERR
इसलिए, अपने प्रश्न के दूसरे भाग का उत्तर देने के लिए, आउटपुट को रीडायरेक्ट करने के लिए वैश्विक चर का उपयोग करें, न कि स्थिरांक। बस अपने कोड में इसे वापस बदलने के लिए सावधान रहें, वैश्विक चर को फिर से परिभाषित करना आपके आवेदन के अन्य हिस्सों को प्रभावित कर सकता है।
$>
डिफ़ॉल्ट आउटपुट स्ट्रीम का उपयोग करना चाहिए , न कि $stdout
।
$stdout
और $>
उपनाम हैं, इसलिए एक को फिर से सौंपना दूसरे को प्रभावित करेगा।
IO#reopen
मामले में उपयोग करना बेहतर है $stdout
? मैं इस राय से पूरी तरह असहमत हूं। $stdout.reopen
विधि mutates अपने रिसीवर और वह भी प्रभावित करेगा STDOUT
यदि आप पुन: असाइन नहीं किया है $stdout
पहले। वे पर्यायवाची होने के लिए नहीं हैं, यह कुछ भी बुरा नहीं है जब वे असाइनमेंट के कारण अलग-अलग मान रखते हैं, और फिर से खोलने से STDOUT
आप इसका उद्देश्य तोड़ रहे हैं।
STDOUT
एक वैश्विक स्थिरांक है, इसलिए इसे बदला नहीं जाना चाहिए। $stdout
पूर्वनिर्धारित चर है, इसलिए इसे बदला जा सकता है।यदि आप पुनर्निर्देशन करने के लिए शेल का उपयोग कर रहे हैं:
$ ruby test.rb > test.log
फिर इससे कोई फर्क नहीं पड़ता कि आप अपनी स्क्रिप्ट के लिए फाइल डिस्क्रिप्टर के रूप में किसका उपयोग करते हैं, आपकी स्क्रिप्ट निष्पादित होने से पहले निर्धारित की जा रही है।
हालाँकि, यदि आप अपने रूबी लिपि के भीतर से OS के STDOUT के लिए फ़ाइल डिस्क्रिप्टर को बदलने का प्रयास कर रहे हैं, उदाहरण के लिए, सप्ताह के वर्तमान दिन के आधार पर लॉग फ़ाइलों के घूर्णन सेट में आउटपुट भेजने के लिए, तो आप यह सुनिश्चित करना चाहेंगे। आप का उपयोग $stdout
।
STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
दोनों $stdout
और STDOUT
अलग अलग अर्थ है। इस विषय पर रूबी का दस्तावेज बहुत स्पष्ट है:
$stdout
- वर्तमान मानक आउटपुट।STDOUT
- मानक उत्पादन। $ Stdout के लिए डिफ़ॉल्ट मान।
जब आप मानक आउटपुट पर लिखना चाहते हैं, तो आप वास्तव में वर्तमान मानक आउटपुट से मतलब रखते हैं , इस प्रकार आपको लिखना चाहिए $stdout
।
STDOUT
बेकार भी नहीं है। यह के लिए डिफ़ॉल्ट मान संग्रहीत करता है $stdout
। यदि आप कभी भी पुनर्मूल्यांकन करते हैं $stdout
, तो आप इसे पिछले मान से पुनर्स्थापित कर सकते हैं $stdout = STDOUT
।
इसके अलावा, एक और पूर्वनिर्धारित चर है:
$>
- प्रिंट, प्रिंटफ के लिए डिफ़ॉल्ट आउटपुट, जो$stdout
डिफ़ॉल्ट रूप से है।
हालांकि यह रूबी 2.3 में दिखता है यह बस के लिए एक उपनाम के रूप में व्यवहार करता है $stdout
। पुन: असाइन करने $stdout
से $>
और इसके विपरीत का मूल्य बदल जाता है।