W Ruby, obiekty mają poręczną metodę zwaną method_missing
który pozwala na obsługiwanie połączeń metoda metod, które nie zostały nawet (wyraźnie) zdefiniowane:Czy istnieją odpowiedniki dla metody Ruby's method_missing w innych językach?
wywoływana przez Ruby gdy obj jest wysyłana wiadomość nie może obsłużyć. symbol jest symbolem dla wywoływanej metody, a argumenty są dowolnymi argumentami, które zostały do niej przekazane. Domyślnie interpreter wywołuje błąd podczas wywoływania tej metody. Możliwe jest jednak zastąpienie tej metody, aby zapewnić bardziej dynamiczne zachowanie. Poniższy przykład tworzy klasę Roman, która odpowiada na metody o nazwach składających się z cyfr rzymskich, zwracając odpowiednie liczby całkowite.
class Roman
def romanToInt(str)
# ...
end
def method_missing(methId)
str = methId.id2name
romanToInt(str)
end
end
r = Roman.new
r.iv #=> 4
r.xxiii #=> 23
r.mm #=> 2000
Na przykład, Ruby on Rails używa tego, aby umożliwić wywołań metod, takich jak find_by_my_column_name
.
Moje pytanie brzmi, jakie inne języki obsługują odpowiednik method_missing
i jak zaimplementować odpowiednik w swoim kodzie?
'roman_to_int' ma pustą implementację, więc dlaczego r.iv zwraca 4? – Tim
@ Tim Załóżmy, że wypełniamy puste pole kodem, który zwróci wartość. Po prostu postanowił nie pokazywać wszystkich szczegółów. Można to zrealizować za pomocą kalkulatora liczby rzymskiej na numer. –