เมื่อเร็ว ๆ นี้ฉันพบวิธีแก้ปัญหานี้ ฉันต้องการสร้างเมธอดในคลาสอาร์เรย์ด้วยพารามิเตอร์ที่เป็นทางเลือกเพื่อเก็บหรือละทิ้งองค์ประกอบในอาร์เรย์
วิธีที่ฉันจำลองสิ่งนี้คือการส่งอาร์เรย์เป็นพารามิเตอร์จากนั้นตรวจสอบว่าค่าที่ดัชนีนั้นเป็นศูนย์หรือไม่
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