Gần đây tôi đã tìm thấy 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 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 truyề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à không 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
Cố gắng ra phương pháp lớp học của chúng tôi với các thông 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, mát mẻ mà làm việc theo kế hoạch. Bây giờ chúng ta hãy kiểm tra và xem điều gì 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 thấy, tùy chọn thứ ba trong mảng đã được gỡ bỏ, do đó bắt đầu một phần khác nhau trong phương pháp và loại bỏ 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ể đã phát hành giá trị bằng 0 trong các tham số. Hình nào trông giống như 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
Một chút xíu với phương pháp này: ví dụ: Nếu bạn đang cố gắng làm cho giá trị mặc định cho 'scope' true và bạn vượt qua trong' false', 'scope || = true' sẽ không hoạt động. Nó đánh giá giống như 'nil' và sẽ đặt nó thành' true' –
là có thể với phiên bản ruby hiện tại, 3 năm sau câu trả lời này? – dalloliogm
@ JoshPinter, giải thích tốt đẹp. Về cơ bản || = không phải là a = b hoặc c, tôi co rúm lại khi thấy 'xyz || = true'. Nó nói rằng nếu nó là không, nó luôn luôn đúng. Nếu đó là sự thật, đó là sự thật. –