ओपी ने लिखा
यह मुझे अजीब लगता है कि ऊपर का निर्माण अपेक्षित परिणाम नहीं देता है। उसका क्या कारण है? जब यह व्यवहार उचित हो तो क्या स्थितियाँ हैं?
नहीं 'यह किया जा सकता है?' लेकिन उस प्रश्न का उत्तर देने के लिए जिसे वास्तव में पूछे जाने वाले प्रश्न से पहले नहीं पूछा गया था:
$ irb
2.1.5 :001 > (0..4)
=> 0..4
2.1.5 :002 > (0..4).each { |i| puts i }
0
1
2
3
4
=> 0..4
2.1.5 :003 > (4..0).each { |i| puts i }
=> 4..0
2.1.5 :007 > (0..4).reverse_each { |i| puts i }
4
3
2
1
0
=> 0..4
2.1.5 :009 > 4.downto(0).each { |i| puts i }
4
3
2
1
0
=> 4
चूंकि रिवर्स_चेज का दावा किया जाता है कि वह एक संपूर्ण सरणी बनाता है, इसलिए स्पष्ट रूप से अधिक कुशल होने जा रहा है। तथ्य यह है कि एक भाषा डिजाइनर भी उस तरह की चीजों को लागू करने पर विचार कर सकता है जो वास्तविक प्रश्न के उत्तर में थोड़े संबंध रखते हैं।
वास्तव में पूछे गए सवाल का जवाब देने के लिए ...
इसका कारण यह है कि रूबी एक बेहद आश्चर्यजनक भाषा है। कुछ आश्चर्य सुखद होते हैं, लेकिन बहुत व्यवहार होता है जो सर्वथा टूट जाता है। भले ही इनमें से कुछ उदाहरणों को नए रिलीज़ द्वारा ठीक किया गया हो, अन्य में बहुत सारे हैं, और वे मूल डिज़ाइन की मानसिकता पर संकेत के रूप में बने हुए हैं:
nil.to_s
.to_s
.inspect
परिणाम "" लेकिन
nil.to_s
# .to_s # Don't want this one for now
.inspect
का परिणाम
syntax error, unexpected '.', expecting end-of-input
.inspect
^
आप शायद उम्मीद करेंगे << और arrays के लिए अपील करने के लिए एक ही धक्का, लेकिन
a = []
a << *[:A, :B] # is illegal but
a.push *[:A, :B] # isn't.
आप शायद अपने यूनिक्स कमांड-लाइन समकक्ष की तरह व्यवहार करने के लिए 'grep' की उम्मीद करेंगे, लेकिन यह === मिलान करता है = इसके नाम के बावजूद नहीं।
$ echo foo | grep .
foo
$ ruby -le 'p ["foo"].grep(".")'
[]
विभिन्न तरीके अप्रत्याशित रूप से एक दूसरे के लिए उपनाम हैं, इसलिए आपको एक ही चीज़ के लिए कई नाम सीखना होगा - जैसे find
और detect
- भले ही आप ज्यादातर डेवलपर्स को पसंद करते हैं और केवल एक या दूसरे का उपयोग करते हैं। ज्यादा एक ही के लिए चला जाता है size
, count
और length
, वर्ग है जो प्रत्येक को अलग ढंग से परिभाषित करते हैं, या एक या दो सब पर परिभाषित नहीं करते के लिए छोड़कर।
जब तक किसी ने कुछ और लागू नहीं किया है - जैसे tap
कि स्क्रीन पर कुछ दबाने के लिए विभिन्न स्वचालन पुस्तकालयों में मुख्य विधि को फिर से परिभाषित किया गया है। सौभाग्य से पता चल रहा है कि क्या चल रहा है, खासकर अगर किसी अन्य मॉड्यूल द्वारा आवश्यक कुछ मॉड्यूल ने अभी तक किसी अन्य मॉड्यूल को बंद कर दिया है जो कुछ अनिर्दिष्ट है।
पर्यावरण चर वस्तु, ENV 'मर्ज' का समर्थन नहीं करता है, इसलिए आपको लिखना होगा
ENV.to_h.merge('a': '1')
एक बोनस के रूप में, आप अपने या किसी और के निरंतर को फिर से परिभाषित कर सकते हैं यदि आप अपना दिमाग बदलते हैं कि उन्हें क्या होना चाहिए।