PrzechodzęProgramowanie Ruby - pragmatyczny przewodnik dla programistówi natknąłem się na ten fragment kodu:
class SongList
def [](key)
if key.kind_of?(Integer)
return @songs[key]
else
for i in [email protected]
return @songs[i] if key == @songs[i].name
end
end
return nil
end
end
Nie rozumiem, jak działa metoda definiowania []?
Dlaczego klucz znajduje się na zewnątrz [], ale gdy wywoływana jest metoda, znajduje się wewnątrz []?
Czy klucz może być bez nawiasów?
Zdaję sobie sprawę, że są o wiele lepsze sposoby, aby to napisać, i wiem, jak napisać własną metodę, która działa, ale ta [] metoda po prostu mnie wprawia w zakłopotanie ... Każda pomoc jest bardzo doceniana, dzięki
Wszystkie odpowiedzi
Metody w języku ruby, w przeciwieństwie do wielu języków, mogą zawierać znaki specjalne. Jednym z nich jest składnia wyszukiwania tablic.
Gdybyś miał zaimplementować własną klasę skrótu, w której podczas pobierania elementu z twojego skrótu chciałbyś go cofnąć, możesz wykonać następujące czynności:
Możesz to udowodnić, wywołując skrót z następującymi elementami:
Zatem def [] zdefiniował metodę, która jest używana, gdy to robisz
my_array["key"]
Inne metody, które mogą wyglądać dziwnie, to:Dla wyjaśnienia, definicja a
[]
metoda nie jest związana z tablicami ani skrótami. Weźmy następujący (wymyślony) przykład:To tylko cukier syntaktyczny. Istnieją pewne wzorce składni, które są tłumaczone na wysyłanie wiadomości. W szczególności
jest taki sam jak
i to samo dotyczy
==
,!=
,<
,>
,<=
,>=
,<=>
,===
,&
,|
,*
,/
,-
,%
,**
,>>
,<<
,!==
,=~
i!~
także.Również,
jest taki sam jak
i to samo dotyczy
~
.Następnie,
jest taki sam jak
i to samo dotyczy
-
.Plus,
jest taki sam jak
Istnieje również specjalna składnia dla ustawiaczy:
jest taki sam jak
I wreszcie, istnieje specjalna składnia indeksowania:
jest taki sam jak
i
jest taki sam jak
nawiasy kwadratowe to nazwa metody
Array#size
ty maszArray#[]
jako metodę i możesz jej nawet używać jak każdej innej metody:ostatni jest czymś w rodzaju cukru syntaktycznego i robi dokładnie to samo, co pierwszy. Plik
Array#+
działają podobnie:Możesz nawet dodać takie liczby:
to samo działa z
/
,*
,-
i wiele więcej.Jest to narzędzie do przeciążania operatorów, nadpisuje lub uzupełnia zachowanie metody wewnątrz zdefiniowanej przez Ciebie klasy lub klasy, której zachowanie modyfikujesz. Możesz to zrobić z innymi operatorami innymi niż []. W tym przypadku modyfikujesz zachowanie elementu [], gdy jest on wywoływany w dowolnej instancji klasy SongList.
Jeśli masz songlist = SongList.new, a następnie wykonasz songlist ["foobar"], wtedy twoja niestandardowa definicja zacznie działać i przyjmie, że "foobar" ma być przekazane jako parametr (klucz) i zrobi to do "foobar" „cokolwiek mówi metoda, należy zrobić klucz.
Próbować
Leave a Reply