2016-01-06 12 views
5

Mam metodę robienia tylko jeden parametr:zdefiniować warunki dotyczące parametru metody za

def my_method(number) 

end 

Jak mogę podnieść błąd, jeśli metoda jest wywoływana z number < 2? I ogólnie, w jaki sposób mogę zdefiniować warunki dla parametru metody?

Na przykład, chcę mieć błąd podczas wywoływania:

my_method(1) 
+2

Nie można stawiać takich ograniczeń bezpośrednio w definicji parametrów. Możesz wykonać sprawdzenie w pierwszym wierszu ciała metody: 'raise: cokolwiek, jeśli liczba <2'. – ndn

+0

@ndn, Błagam o różnicę. Proszę zobaczyć moją odpowiedź. –

Odpowiedz

6

Możesz dodać guard na początku funkcji i zgłosić wyjątek, jeśli argumenty są niepoprawne. Na przykład:

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 

można zdefiniować custom exception klasę, jeśli nie chcesz korzystać z ArgumentError


Jeśli budujesz coś jak ramy, wówczas można skorzystać z meta- techniki programowania służące do przechwytywania wywołań metod i stosowania niektórych sprawdzeń. Patrz Executing code for every method call in a Ruby module. Być może trzeba będzie wymyślić jakiś rodzaj DSL, aby wyrazić te walidacje - typowy przykład sprawdzania poprawności DSL to Active Record Validations w Railsach.

Podsumowując, w przypadku codziennego użytku powinny wystarczyć proste raise (or fail) i rescue. Meta-programowanie i walidacje oparte na DSL są potrzebne tylko wtedy, gdy budujesz strukturę ogólnego przeznaczenia.

+1

Nie musisz wywoływać 'new', wystarczy przekazać klasę wyjątków i komunikat, np.' Raise ArgumentError, "Input powinno być ..." (lub 'fail' zgodnie ze stylem Ruby) – Stefan

+0

@Stefan Wielkie dzięki. Zaktualizowałem kod. Doceń wkłady, które pozostawiasz na różnych stanowiskach. –

1

Musisz sprawdzić stan i podnieść go wewnątrz metody ciała. Nie ma wbudowanej opcji, jak chcesz.

1

Można to zrobić:

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

Nie ... Cary ... Wiesz, że to po prostu zło. (: – ndn

+1

@ndn, z mojego doświadczenia, złe odpowiedzi są często pomijane. –

Powiązane problemy