Gần đây tôi đã tìm ra một cách để giải quyết vấn đề này. Tôi muốn tạo một phương thức trong lớp mảng với một tham số tùy chọn, để giữ hoặc loại bỏ các phần tử trong mảng.
Cách tôi mô phỏng điều này là bằng cách chuyển một mảng làm tham số và sau đó kiểm tra xem giá trị tại chỉ mục đó có phải là nil hay không.
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
Đang thử phương thức lớp của chúng tôi với các tham số khác nhau:
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)
đầu ra: ["1", "2", "a", "b", "c"]
Được rồi, thật tuyệt. Bây giờ hãy kiểm tra và xem điều gì sẽ xảy ra nếu chúng ta không truyền vào tùy chọn tham số thứ ba (1) trong mảng.
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)
đầu ra: ["a", "b", "c"]
Như bạn có thể thấy, tùy chọn thứ ba trong mảng đã bị xóa, do đó bắt đầu một phần khác trong phương thức và xóa tất cả các giá trị ASCII không nằm trong phạm vi của chúng tôi (32-126)
Ngoài ra, chúng tôi có thể đã đưa ra giá trị là nil trong các tham số. Khối nào trông giống với khối mã sau:
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
true và bạn chuyển vàofalse
,scope ||= true
sẽ không hoạt động. Nó đánh giá giống nhưnil
và sẽ đặt nó vàotrue