Czy ktoś może mi wyjaśnić, jakie jest znaczenie dodania self
do definicji metody? Czy jest podobne do słowa kluczowego this
w java?Co oznacza def `self.function` name?
Odpowiedz
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.
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.
To jest * w ogóle nic * jak "statyczne". W szczególności metody te są dynamiczne, a nie statyczne. –
@ JörgWMittag: jest jak "statyczny" język Java w co najmniej jednym znaczeniu - dotyczy raczej poziomu klasy niż poziomu instancji. –
@ JörgWMittag -
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
To jest * nic w ogóle * jak "statyczne". W szczególności metody te są dynamiczne, a nie statyczne. –
jeśli zdefiniujesz 'Class # method' w ruby z def' self.method ... 'to trochę jak' klasa JavaClass; public static void method ... 'in java – krichard
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. –
- 1. Co oznaczają "def + @" i "def - @"?
- 2. co def def: self.up, def-up, def self.down, def down?
- 3. Co oznacza "typ rekursywny <method name>" w Scali?
- 4. django request.session.get ("name", False) - Co oznacza ten kod?
- 5. Ruby: Co oznacza 1 $?
- 6. Co oznacza (+ var) oznacza
- 7. Co oznacza "args" w CliBuilderze?
- 8. Co znaczy: co oznacza?
- 9. Co oznacza RETVAL?
- 10. Co oznacza = *?
- 11. Co oznacza "::"?
- 12. Co oznacza xmlns = "" dokładnie oznacza
- 13. co oznacza „$ &” oznacza w Ruby
- 14. Co oznacza Post.all.map (&: id)?
- 15. Co oznacza "**" w ANT?
- 16. Co oznacza "javax.naming.NoInitialContextException"?
- 17. co oznacza aspekt w Solr?
- 18. Co oznacza ["ciąg"] .pakiet ("H *")?
- 19. Co oznacza "rodzic" w styles.xml?
- 20. Co oznacza tylda (~) w tym przykładzie Scali?
- 21. Co oznacza destrukturyzacja w Clojure?
- 22. Przydatność def __init __ (self)?
- 23. Co oznacza "ja" w javascript?
- 24. Co oznacza 0x0F? A co oznacza ten kod?
- 25. Co oznacza "CL" w komunikacie zatwierdzenia? Co to oznacza?
- 26. Co oznaczają nazwy katalogów "." i ".." oznacza i co oznacza faDirectory?
- 27. Co oznacza "?", Używane po nazwie pliku JavaScript, co oznacza?
- 28. Co to jest "Call By Name"?
- 29. Co oznacza <- oznacza w Javie?
- 30. Co oznacza "~" oznacza, zanim teksty stałe
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ę! –