रूबी में, $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से $>और इसके विपरीत का मूल्य बदल जाता है।