Спомням си че бях на тази лекция но не мога да намеря слайдовете.
Къде е лекцията за предефиниране на оператори?
Дам. Явно е само това. Спомням си че в час дадоха доста повече примери.
Няма много, което може да се каже за предефиниране на оператори. Определено няма материал за цяла лекция. Схемата е супер проста - метода има същото име. По-важното е как работят самите оператори, но това трябва да ви е познато от други езици. Повечето са бинарни, има няколко унарни (
+,-,!). Има малко по-подробни семантики, (например чеa += bсе превежда доa = a + b, ако+=не е дефинирано), но това са излишни детайли (засега).Ето тук има списък с всички оператори, както и кои могат да се предефинират. Таблицата е подредена по приоритет. Единственото, което липсва, е асоциативност, но тя е стандартна (повдигане на степен и присвояване е дясно-асоциативно, останалото е ляво-асоциативно).
Ако някой иска да напише хубаво обяснение за това какво е приоритет и асоциативност на оператори, моля да го направи. Ще го възнаградим подобаващо.
Приоритет на оператори
Определя реда, в който операторите се изпълняват. Операторите с по-висок приоритет се изпълняват преди тези с по-нисък.
Асоциативност на оператори
Определя реда, в който оператори с един и същ приоритет се изпълняват.
Пример:
a OP b OP c- Ляво-асоциативни оператори се изпълняват така:
(a OP b) OP c - Дясно-асоциативни оператори се изпълняват така:
a OP (b OP c)
Примери
-
1 || 2 && 3=>1. && има по-висок приоритет от || и затова първо се оценява2 && 3=> 3, след което1 || 3=> 1. -
1 || 2 and 3=>3. || има по-висок приоритет от and и затова първо се оценява1 || 2=> 1, след което1 and 3=> 3. -
2 + 2 * 3 + 1=>2 + 6 + 1=>8 + 1=>9. Това е ясно. -
5 == true == 'foo'=>синтактична грешка. == е неасоциативен оператор. -
2 ** 3 ** 2=>2 ** 9=>512. Понеже ** e дясно-асоциативен оператор. Присвояването също. -
3.next.next=>4.next=>5. Точка . е ляво-асоциативен оператор също.
Общо взето има си правила и това е... Още примери и информация тук и тук.
- Ляво-асоциативни оператори се изпълняват така:
Трябва да сте влезли в системата, за да може да отговаряте на теми.
