Къде е лекцията за предефиниране на оператори?

  1. Няма много, което може да се каже за предефиниране на оператори. Определено няма материал за цяла лекция. Схемата е супер проста - метода има същото име. По-важното е как работят самите оператори, но това трябва да ви е познато от други езици. Повечето са бинарни, има няколко унарни (+, -, !). Има малко по-подробни семантики, (например че a += b се превежда до a = a + b, ако += не е дефинирано), но това са излишни детайли (засега).

    Ето тук има списък с всички оператори, както и кои могат да се предефинират. Таблицата е подредена по приоритет. Единственото, което липсва, е асоциативност, но тя е стандартна (повдигане на степен и присвояване е дясно-асоциативно, останалото е ляво-асоциативно).

    Ако някой иска да напише хубаво обяснение за това какво е приоритет и асоциативност на оператори, моля да го направи. Ще го възнаградим подобаващо.

  2. Приоритет на оператори

    Определя реда, в който операторите се изпълняват. Операторите с по-висок приоритет се изпълняват преди тези с по-нисък.

    Асоциативност на оператори

    Определя реда, в който оператори с един и същ приоритет се изпълняват.

    Пример: 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. Точка . е ляво-асоциативен оператор също.

    Общо взето има си правила и това е... Още примери и информация тук и тук.

Трябва да сте влезли в системата, за да може да отговаряте на теми.