Спомням си че бях на тази лекция но не мога да намеря слайдовете.
Къде е лекцията за предефиниране на оператори?
Дам. Явно е само това. Спомням си че в час дадоха доста повече примери.
Няма много, което може да се каже за предефиниране на оператори. Определено няма материал за цяла лекция. Схемата е супер проста - метода има същото име. По-важното е как работят самите оператори, но това трябва да ви е познато от други езици. Повечето са бинарни, има няколко унарни (
+
,-
,!
). Има малко по-подробни семантики, (например че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
. Точка . е ляво-асоциативен оператор също.
Общо взето има си правила и това е... Още примери и информация тук и тук.
- Ляво-асоциативни оператори се изпълняват така:
Трябва да сте влезли в системата, за да може да отговаряте на теми.