हाल ही में मुझे इसके चारों ओर एक रास्ता मिला। मैं सरणी में तत्वों को रखने या छोड़ने के लिए एक वैकल्पिक पैरामीटर के साथ सरणी वर्ग में एक विधि बनाना चाहता था।
जिस तरह से मैंने इसका अनुकरण किया वह एक सरणी को पैरामीटर के रूप में पारित करने से था, और फिर यह जांचना कि क्या उस सूचकांक का मान शून्य था या नहीं।
class Array
def ascii_to_text(params)
param_len = params.length
if param_len > 3 or param_len < 2 then raise "Invalid number of arguments #{param_len} for 2 || 3." end
bottom = params[0]
top = params[1]
keep = params[2]
if keep.nil? == false
if keep == 1
self.map{|x| if x >= bottom and x <= top then x = x.chr else x = x.to_s end}
else
raise "Invalid option #{keep} at argument position 3 in #{p params}, must be 1 or nil"
end
else
self.map{|x| if x >= bottom and x <= top then x = x.chr end}.compact
end
end
end
विभिन्न मानकों के साथ हमारे वर्ग विधि की कोशिश:
array = [1, 2, 97, 98, 99]
p array.ascii_to_text([32, 126, 1]) # Convert all ASCII values of 32-126 to their chr value otherwise keep it the same (That's what the optional 1 is for)
उत्पादन: ["1", "2", "a", "b", "c"]
ठीक है, शांत जो नियोजित के रूप में काम करता है। अब देखते हैं और देखते हैं कि क्या होता है जब हम सरणी में तीसरे पैरामीटर विकल्प (1) में पास नहीं होते हैं।
array = [1, 2, 97, 98, 99]
p array.ascii_to_text([32, 126]) # Convert all ASCII values of 32-126 to their chr value else remove it (1 isn't a parameter option)
उत्पादन: ["a", "b", "c"]
जैसा कि आप देख सकते हैं, सरणी में तीसरा विकल्प हटा दिया गया है, इस प्रकार विधि में एक अलग अनुभाग शुरू करना और सभी ASCII मूल्यों को हटाना जो हमारी सीमा में नहीं हैं (32-126)
वैकल्पिक रूप से, हम मापदंडों में शून्य के रूप में मूल्य जारी कर सकते थे। जो निम्न कोड ब्लॉक के समान होगा:
def ascii_to_text(top, bottom, keep = nil)
if keep.nil?
self.map{|x| if x >= bottom and x <= top then x = x.chr end}.compact
else
self.map{|x| if x >= bottom and x <= top then x = x.chr else x = x.to_s end}
end
scope
सत्य के लिए डिफ़ॉल्ट मान बनाने की कोशिश कर रहे हैं और आप इसमें से गुजरते हैंfalse
,scope ||= true
तो काम नहीं करेगा। यह उसी तरह का मूल्यांकन करता हैnil
और इसे करने के लिए सेट करेगाtrue