एक बार एक बयान निष्पादित करने के लिए सबसे कम रूबी एक-लाइनर - रूबी, डिबगिंग

मैं सबसे छोटी, सबसे सरल रूबी की तलाश में हूंएक बार एक कथन एक बार एक बयान निष्पादित करने के लिए। आइडिया इसका उपयोग तब करना है जब डीबगिंग को एक लूप में तुरंत डीबग स्टेटमेंट जोड़ने के लिए जो एक बार निष्पादित हो जाता है।

सबसे अच्छा मैं अब तक आया हूँ:

puts "do something interesting exactly once!" if (once ||= "0").next! == "1"

क्या आप कुछ भी कम के साथ आ सकते हैं?

स्पष्टीकरण के लिए जोड़ा गया:

प्रश्नों के लिए विचार पर ध्यान देना था"इसे एक बार करें" भाग लें और "कुछ दिलचस्प करें" भाग पर इतना अधिक नहीं। यह माना जाना चाहिए कि कोड को निष्पादित किया जाना चाहिए, एक बार कुछ भी हो सकता है, केवल एक कथन कथन नहीं।

आदर्श समाधान विभिन्न प्रकार के लूप संरचनाओं में भी काम करेगा। जैसे जैसा कि मेरा प्रारंभिक समाधान इंगित किया गया था केवल तभी काम करता है once परिवर्तनीय पहले से ही लूप संदर्भ के बाहर परिभाषित किया गया है या यदि लूप संदर्भ का उपयोग नहीं किया गया है तो यह एक नया अक्षीय दायरा नहीं बना सकता है।

मूल उपयोग केस जो इसे ट्रिगर करता हैसवाल थोड़ा अलग था - यह नीचे की तरह दिखता था। लेकिन मैं उपर्युक्त, सरल उदाहरण अधिक आसानी से उस समाधान के बारे में समझाऊंगा जो मैं ढूंढ रहा था।

def process
do_some_preprocessing()

raise SomeError if <once> # added temp. for debugging purposes - the <once> part is what this question is about!
dangerous_operation() # this can raise SomeError under certain conditions

rescue SomeError
attempt_to_rescue() and retry
end

उत्तर:

जवाब के लिए 0 № 1

(टिप्पणियों में चर्चा को दर्शाने के लिए संपादित उत्तर)

आपका कोड वह नहीं करता जो आप करना चाहते हैं, यह आपके द्वारा उपयोग किए जाने वाले लूपिंग निर्माण पर निर्भर करेगा।

यह काम करेगा:

puts "do something interesting exactly once!" if once = once.nil?

लेकिन इस के साथ, आपको परिभाषित करना होगा once पहले: once = nil (अपने कोड के लिए एक ही बात)। ऐसा इसलिए है क्योंकि अन्यथा, का दायरा once परिवर्तनीय को ब्लॉक के भीतर अवरुद्ध कर दिया जाएगा each पाश, यह असफल होने के कारण। यह सिर्फ एक के भीतर ठीक काम करेगा for loop (जिस तरह से आपने इसका परीक्षण किया होगा):

(1..3).each do    # 3.times would behave just the same
puts "once has not been defined before! Won"t work!" if once = once.nil?
end
# >once has not been defined before! Won"t work!
# once has not been defined before! Won"t work!
# once has not been defined before! Won"t work!

for i in 1..3 do
puts "Works because of the way for loops treat vars within loop" if once = once.nil?
end
# >Works because of the way for loops treat vars within loop

पहले वैरिएबल को प्रारंभ किए बिना उस समस्या से बचने के लिए, आप कर सकते हैं once वैश्विक:

(1..3).each do
puts "$once"s scope is not restrained to the "each" loop! Works!" if $once = $once.nil?
end
# >$once"s scope is not restrained to the "each" loop! Works!

जवाब के लिए 2 № 2

खैर, आप भेड़ के बच्चे और बंदियों का दुरुपयोग कर सकते हैं।

->{puts "do something interesting exactly once!";x=->{x}}[][]
#=> do something interesting exactly once!
#=> #<Proc:[email protected](irb):10 (lambda)>

लैम्ब्डा की मूल सामग्री केवल एक बार चलती है; किसी भी बाद के आविष्कार बस एक खाली proc वापस कर देंगे।

आप वैकल्पिक रूप से अधिक वास्तविक "एक-लाइनर" के लिए ग्लोबल्स का दुरुपयोग कर सकते हैं, लेकिन यह भयानक है।

$x ||= puts("do something interesting exactly once!") || 1

उत्तर № 3 के लिए 1
debug = ["do something interesting exactly once!"]
puts debug.pop # "do something interesting exactly once!"
puts debug.pop # nil

जवाब के लिए 0 № 4

मूल विचार कोड-गंध उत्पन्न करता है।इसका परिणाम कोड में होता है जो किसी और को अपने सिर को खरोंच कर देगा, जो एक अच्छी बात नहीं है। स्पष्ट कोड और समझने में आसान कोड उत्पन्न करने से आपका और अन्य प्रोग्रामर काम आसान हो जाएगा।

कोड लिखने में कुछ समय लगता है, भविष्य में पता लगाने में आपको कुछ समय लगेगा यदि आप "भविष्य में स्वयं को डिबग करना चाहते हैं।

मैं एक साधारण ध्वज का उपयोग कर मानक तरीके से चिपक जाता हूं:

once = false
2.times do
puts "do something interesting exactly once!" unless once
once ||= true
end

इस आउटपुट में कौन सा परिणाम:

# >> do something interesting exactly once!

संबंधित सवाल
सबसे लोकप्रिय