Tôi có một phương thức với đối số tùy chọn. Làm cách nào tôi có thể quyết định liệu Đối số có được đưa ra hay không?Cách quyết định xem đối số tùy chọn đã được đưa ra hay không theo phương pháp ruby
Tôi đã đưa ra các giải pháp sau. Tôi hỏi câu hỏi này vì tôi không hoàn toàn hài lòng với bất kỳ câu hỏi nào trong số họ. Hiện có một tốt hơn?
nil
như giá trị mặc định
def m(a= nil)
if a.nil?
...
end
end
Hạn chế với một này là, rằng nó không thể được quyết định dù không có đối số hoặc nil
đã được đưa ra.
tùy chỉnh NoArgument
như giá trị mặc định
class NoArgument
end
def m(a= NoArgument.new)
if NoArgument === a
...
end
end
Dù nil
đã được đưa ra có thể được quyết định, nhưng cùng một vấn đề tồn tại cho trường hợp của NoArgument
.
Đánh giá kích thước của một ellipsis
def m(*a)
raise ArgumentError if m.size > 1
if m.size == 1
...
end
end
Trong phiên bản này nó có thể luôn luôn quyết định liệu các đối số tùy chọn đã được đưa ra. Tuy nhiên, Proc#arity
của phương pháp này đã thay đổi từ 1 đến -1 (không đúng, xem nhận xét). Nó vẫn có những bất lợi của việc nuôi ong tồi tệ hơn đối với tài liệu và cần phải tự nâng cao ArgumentError.
Lệnh 'arity' của tất cả các phương pháp của bạn là' -1'. Hạn chế duy nhất của giải pháp cuối cùng là bạn phải tự kiểm tra rằng không có nhiều hơn một đối số được đưa ra và tài liệu là cần thiết để biết các đối số là gì. –