2016-01-06 11 views
5

Tôi có một phương pháp dùng chỉ có một tham số:Xác định điều kiện về tham số của một phương pháp

def my_method(number) 

end 

Làm thế nào tôi có thể nâng cao một lỗi nếu phương pháp này được gọi với một number < 2? Và nói chung, làm thế nào tôi có thể xác định các điều kiện trên tham số của phương thức?

Ví dụ, tôi muốn có một lỗi khi gọi:

my_method(1) 
+2

Bạn không thể đặt những hạn chế như vậy trực tiếp trong định nghĩa tham số. Bạn có thể thực hiện kiểm tra trong dòng đầu tiên của phần thân của phương thức: 'raise: any if number <2'. – ndn

+0

@ndn, tôi cầu xin sự khác biệt. Xin vui lòng xem câu trả lời của tôi. –

Trả lời

6

Bạn có thể thêm guard vào đầu hàm và tăng ngoại lệ nếu đối số không hợp lệ. Ví dụ:

def my_method(number) 
    fail ArgumentError, "Input should be greater than or equal to 2" if number < 2 

    # rest of code follows 
    # ... 
end 

# Sample run 
begin 
    my_method(1) 
rescue => e 
    puts e.message 
end 
#=> Input should be greater than or equal to 2 

Bạn có thể xác định custom exception lớp nếu bạn không muốn sử dụng ArgumentError


Nếu bạn đang xây dựng một cái gì đó giống như một khuôn khổ, sau đó, bạn có thể tận dụng meta- kỹ thuật lập trình để chặn các lời gọi phương thức và áp dụng một số xác nhận hợp lệ. Tham khảo Executing code for every method call in a Ruby module. Bạn có thể phải đưa ra một số loại DSL để thể hiện những xác nhận đó - một ví dụ điển hình về việc xác thực DSL là Active Record Validations trong Rails.

Tóm lại, đối với các trường hợp sử dụng hàng ngày, đơn giản raise (or fail) và rescue là đủ. Việc xác thực dựa trên meta-lập trình và DSL chỉ cần thiết nếu bạn đang xây dựng một khung công tác chung.

+1

Bạn không cần phải gọi 'new', chỉ cần vượt qua lớp ngoại lệ và thông báo, tức là' raise ArgumentError, "Đầu vào phải là ..." '(hoặc' fail' theo hướng dẫn kiểu Ruby) – Stefan

+0

@Stefan Cảm ơn rất nhiều. Tôi đã cập nhật mã. Đánh giá cao các yếu tố đầu vào bạn để lại phía sau trên các bài đăng khác nhau. –

1

Bạn sẽ phải kiểm tra điều kiện và nâng cao nó bên trong phương pháp cơ thể. Không có tùy chọn nội trang như bạn muốn.

1

Bạn có thể làm điều này:

def my_method arg, dummy = (raise ArgumentError, "arg < 2" if arg < 2) 
    puts "arg=#{arg}" 
end 
my_method 3 
    # arg=3 
my_method 1 
    # ArgumentError: arg < 2 
+0

Không ... Cary ... Bạn biết điều này chỉ là ác. (: – ndn

+1

@ndn, theo kinh nghiệm của tôi, câu trả lời độc ác thường bị bỏ qua. –

Các vấn đề liên quan