Как работи методът на дефиниране на [квадратна скоба] в Ruby?
This question and all comments follow the
"Attribution Required."
Подобни проблеми
- Дефиниране на метод вътре в модул в ruby (NoMethodError)
- methods - Как работи операторът на Ruby's. ()?
- ruby on rails - Определете метода за отношението на активния запис
- metaprogramming - Динамично определяне на методите на класа в Ruby
- syntax - Дефиниране на метод в Ruby с равни
- Още подобни въпроси >>
Всички отговори
Методите в рубин, за разлика от много езици, могат да съдържат някои специални знаци. Един от тях е синтаксисът за търсене на масив.
Ако трябваше да внедрите свой собствен хеш клас, при който при извличане на елемент във вашия хеш искате да го обърнете, можете да направите следното:
Можете да докажете това, като извикате хеш със следното:
Така че def [] определи метода, който се използва, когато го направите
my_array["key"]
Други методи, които може да ви изглеждат странни, са:Само за да изясня, дефиницията на a
[]
метод не е свързан с масиви или хешове. Вземете следния (измислен) пример:Това е просто синтактична захар. Има определени синтаксисни модели, които се превръщат в изпращания на съобщения. По-специално
е същото като
и същото важи за
==
,!=
,<
,>
,<=
,>=
,<=>
,===
,&
,|
,*
,/
,-
,%
,**
,>>
,<<
,!==
,=~
и!~
както добре.Също,
е същото като
и същото важи за
~
.Тогава,
е същото като
и същото важи за
-
.Плюс това,
е същото като
Има и специален синтаксис за сетери:
е същото като
И не на последно място, има специален синтаксис за индексиране:
е същото като
и
е същото като
квадратните скоби са името на метода като
Array#size
ти имашArray#[]
като метод и дори можете да го използвате като всеки друг метод:последният е нещо като синтактична захар и прави точно същото като първото. The
Array#+
работа подобно:Можете дори да добавяте числа като това:
същото работи с
/
,*
,-
и много други.Това е претоварващ оператор, той замества или допълва поведението на метод в клас, който сте дефинирали, или клас, чието поведение модифицирате. Можете да го направите на други оператори, различни от []. В този случай вие модифицирате поведението на [], когато той е извикан във всеки екземпляр на класа SongList.
Ако имате списък с песни = SongList.new и след това правите списък с песни ["foobar"], тогава вашият персонализиран деф ще влезе в действие и ще приеме, че "foobar" трябва да бъде предаден като параметър (ключ) и ще направи "foobar "каквото и да се казва в метода, трябва да се направи ключово.
Опитвам
Leave a Reply