2012-12-04 19 views

Odpowiedz

48

W przeciwieństwie do innych języków, Ruby nie ma metod klasy, ale ma pojedyncze metody dołączone do konkretnego obiektu.

cat = String.new("cat") 
def cat.speak 
    'miaow' 
end 
cat.speak #=> "miaow" 
cat.singleton_methods #=> ["speak"] 

def cat.speak stworzył metodę singleton dołączoną do obiektu cat.

Kiedy piszesz class A, jest to równoważne A = Class.new:

A = Class.new 
def A.speak 
    "I'm class A" 
end 
A.speak #=> "I'm class A" 
A.singleton_methods #=> ["speak"] 

def A.speak stworzył metodę singleton dołączony do obiektu A. Używamy nazwać to metoda klasy do klasy A.

Podczas pisania należy utworzyć instancję klasy (*).Wewnątrz definicji klasy, Ruby ustawia siebie na tę nową instancję klasy, która została przypisana do stałej A. Tak więc def self.c_method jest równoważne def cat.speak, to znaczy definiujesz metodę singleton dołączoną do ja obiektu, która jest obecnie klasa A.

Teraz klasa A ma dwie metody singletonowe, które zwykle nazywamy metodami klasowymi.

A.singleton_methods 
=> ["c_method", "speak"] 

(*) technicznie, w tym przypadku, gdy został już utworzony przez A = Class.new, class A wznawia istniejącą klasę. Dlatego na końcu mamy dwie metody singletowe. Ale w zwykłym przypadku, gdy jest to pierwsza definicja klasy, oznacza to Class.new.

+6

To jest poprawna odpowiedź. Prawdą jest, że doświadczeni rubiści czasami używają terminu "metoda klasy" do oznaczenia "metody instancji klasy pojedynczej obiektu klasy", ale używają tego skrótu tylko przy pełnym zrozumieniu, że * nie ma czegoś takiego jak metoda klasy * w Rubin. (W rzeczywistości nie ma czegoś takiego jak "metoda singletona": metody singleton są po prostu zwykłymi metodami, które zdarzają się być zdefiniowane w klasie singleton obiektu.) OP jednak jest oczywiście * nie * doświadczonym Rubyistą , dlatego mylenie go ze stenografią nie jest dobrym pomysłem. Kciuki w górę! –

7

Podczas deklarowania metody, self deklaracji jest deklarującą klasą/modułem, więc efektywnie definiujesz metodę klasy. Jest to podobne do metody static w java. Można nazwać metodę na klasie zamiast instancji: MyClass.method

Here można znaleźć więcej szczegółów na temat metod klas i instancji.

EDIT: Chociaż kluczowe self jest zbliżona do this słów kluczowych w języku Java, skutki korzystania self dla deklaracji metody klasy są podobne do skutku za pomocą static słowa kluczowego w Javie. Podobieństwo jest takie, że statyczne metody w języku Java, takie jak metody klas w ruby, są dostępne przy użyciu obiektu klasy ja zamiast instancji klasy.

Należy pamiętać, że static nie oznacza przeciwieństwa dynamicznego. Wybór nazwy tego słowa kluczowego jest wątpliwy (prawdopodobnie odziedziczony po C) i powinien być raczej nazwany perClass lub podobny, aby lepiej odzwierciedlić znaczenie. Techniczne znaczenie ma to, że wszystkie elementy static istnieją tylko raz dla każdego programu ładującego klasy.

+1

To jest * w ogóle nic * jak "statyczne". W szczególności metody te są dynamiczne, a nie statyczne. –

+3

@ JörgWMittag: jest jak "statyczny" język Java w co najmniej jednym znaczeniu - dotyczy raczej poziomu klasy niż poziomu instancji. –

+3

@ JörgWMittag - jest dość silnym określeniem dla czegoś z wyraźnymi podobieństwami (i na pewno są różnice). dodałem trochę informacji, aby wyjaśnić mój punkt widzenia. – kostja

29

W języku ruby ​​self jest nieco podobne do this w języku Java, ale jeśli chodzi o klasy, bardziej przypomina słowo kluczowe static w języku Java. Krótki przykład:

class A 
    # class method 
    def self.c_method 
    true 
    end 
    # instance method 
    def i_method 
    true 
    end 
end 

A.c_method #=> true 
A.i_method #=> failure 
A.new.i_method #=> true 
A.new.c_method #=> failure 

Aktualizacja: Różnica między metod statycznych metod Java i klasy w Ruby

statyczne metody w Javie mają dwie odrębne funkcje, które sprawia, że ​​różni się od metody instancji: a) są statyczne, b) nie są powiązane z instancją. (IOW: oni naprawdę nie są jak metody, są tylko procedurami.) W Ruby wszystkie metody są dynamiczne, a wszystkie metody są powiązane z instancją. W rzeczywistości, w przeciwieństwie do Javy, gdzie istnieją trzy różne rodzaje "metod" (metody instancji, metody statyczne i konstruktory), istnieje tylko jeden rodzaj metody w Ruby: metody instancji. Więc nie: statyczne metody w Javie są zupełnie niepodobne do metod w Ruby. - Jörg W Mittag 1 godzina temu

+0

To jest * nic w ogóle * jak "statyczne". W szczególności metody te są dynamiczne, a nie statyczne. –

+0

jeśli zdefiniujesz 'Class # method' w ruby ​​z def' self.method ... 'to trochę jak' klasa JavaClass; public static void method ... 'in java – krichard

+2

Metody statyczne w Javie mają dwie odrębne cechy, które odróżniają je od metod instancji: a) są statyczne, b) nie są powiązane z instancją. (IOW: w rzeczywistości nie są to metody *, są tylko procedurami.) W Ruby * wszystkie * metody są dynamiczne, a * wszystkie * metody są powiązane z instancją. W rzeczywistości, w przeciwieństwie do Javy, gdzie istnieją trzy różne rodzaje "metod" (metody instancji, metody statyczne i konstruktory), istnieje tylko jeden rodzaj metody w Ruby: metody instancji. Więc nie: statyczne metody w Javie są zupełnie niepodobne do metod w Ruby. –