Metody

Co to jest metoda? W programowaniu OO nie myślimy o operowaniu na danych bezpośrednio z zewnątrz obiektu; a raczej obiekty mają pewne zrozumienie, jak działać na sobie (gdy ładnie o to poproszono). Można powiedzieć, że przekazujemy do obiektu wiadomości, a te wiadomości zazwyczaj wywołują jakiś rodzaj działania lub znaczącą odpowiedź. To powinno się zdarzyć bez naszej koniecznej znajomości lub dbałości o to, jak naprawdę działa obiekt. Dozwolone przez nas zadania do wykonania na obiekcie (lub równoważnie, zrozumiałe wiadomości) są metodami obiektu.

W ruby ​​wywołujemy metodę obiektu z notacją kropki (tak jak w C++ lub Java). Obiekt z którym rozmawiałem, ma nazwę na lewo od kropki.

ruby> "abcdef".length
   6

Intuicyjnie, ten obiekt string jest pytany jak długi jest. Technicznie rzecz biorąc, powołujemy się na metodę length obiektu "abcdef".

Inne obiekty mogą mieć nieco inną interpretację długości lub wcale jej nie mieć. Decyzje dotyczące jak odpowiedzieć na wiadomość są wykonywane w locie, podczas wykonywania programu, a podjęte działania mogą się zmienić w zależności od tego, do jakiej zmiennej się odnosi.

ruby> foo = "abc"
   "abc"
ruby> foo.length
   3
ruby> foo = ["abcde", "fghij"]
   ["abcde", "fghij"]
ruby> foo.length
   2

Oznacza to, że długość może różnić się w zależności od obiektu, o którym mówimy. W powyższym przykładzie za pierwszym razem pytamy foo o jego długość, odnosi się ona do prostego ciągu i może być tam tylko jedna rozsądna odpowiedź. Za drugim razem foo odnosi się do tablicy i możemy rozsądnie pomyśleć o jego długości jako 2, 5 lub 10; ale najczęściej odpowiednią odpowiedzią jest oczywiście 2 (jeśli chcesz możesz uzyskać inne rodzaje długości).

ruby> foo[0].length
   5
ruby> foo[0].length + foo[1].length
   10

Warto zauważyć, że tablica wie coś o tym, co to znaczy być tablicą. Fragmenty danych w ruby noszą taką wiedzę, dzięki czemu takie żądania mogą być automatycznie spełnione na różne sposoby. To zwalnia programistę z ciężaru zapamiętywania dużej liczby specyficznych nazw funkcji, a ponieważ stosunkowo niewielka liczba nazw metod, odpowiada pojęciom, które potrafimy wyrazić w języku naturalnym, to mogą one być zastosowane do różnych rodzajów danych, by otrzymać oczekiwane wyniki. To właściwość z obiektowo zorientowanych języków programowania (która, moim zdaniem, w Javie nie wyszła) która jest nazywana polimorfizmem.

Kiedy obiekt otrzyma wiadomość, której nie rozumie, błąd jest "podniesiony":

ruby> foo = 5
   5
ruby> foo.length
ERR: (eval):1: undefined method `length' for 5(Fixnum)

Dlatego trzeba wiedzieć, jakie metody są do zaakceptowania dla obiektu, chociaż nie musimy wiedzieć, jak są przetwarzane.

Jeśli argumenty są podane dla metody, zazwyczaj są one otoczone nawiasami,

object.method(arg1, arg2)

ale można je pominąć, jeśli to nie powoduje dwuznaczności.

object.method arg1, arg2

W ruby istnieje specjalna zmienna self; odnosi się do dowolnego obiektu wywołującego metodę. Tak często zdarza się, że dla wygody "self." może zostać pominięte w wywołaniach metody dla samego obiektu:

self.method_name(args...)

jest tym samym co

method_name(args...)

To, co uważamy tradycyjnie jako wywołanie funkcji to tylko ten skrócony sposób pisania metod przez self. To powoduje, że ruby zwany jest czystym językiem zorientowanym obiektowo. Niemniej jednak, metody funkcyjne zachowują się zupełnie podobnie do funkcji w innych językach programowania, z korzyścią dla tych, którzy nie wymieniają, jak wywołania funkcji są naprawdę metodami obiektowymi w ruby. Jeśli chcemy możemy mówić o funkcjach tak, jakby naprawdę nie były obiektami.