Inline

Начиная с haXe 1.17, в язык добавлено новое ключевое слово inline. Оно может использоваться в двух случаях: для статических переменных и для любых методов.

===== Статические Inline переменные =====

Для статических переменных всё довольно просто. Каждый раз, когда переменная используется, берётся само её значение вместо доступа к переменной. Например:

class Test {
    static inline var WIDTH = 500;
    static function main() {
        trace(WIDTH);
    }
}
</div>

Использование "inline" накладывает пару ограничений:
* переменная должна быть инициализирована при объявлении (получить значение)
* переменная не может быть изменена

(можно сказать, что "inline" переменные в haXe это аналог констант в других языках)

Главное преимущество в использовании "inline" состоит в том, что вы можете использовать столько переменных, сколько вам нужно, без замедления кода временем доступа к этим переменным, поскольку их значение подставляется напрямую в скомпилированном / сгенерированном коде.

===== Инлайн методы =====

Для методов принцип тот же. Наименее ресурсоёмкий вызов функции - тот, который никогда не производится. Для достижения этого в маленьких методах, которые часто вызываются, вы можете добавить ключевое слово "inline" в месте объявления функции.

Давайте посмотрим на пример:

class Point {
   public var x : Float;
   public var y : Float;
   public function new(x,y) { this.x = x; this.y = y; }
   public inline function add(x2,y2) { return new Point(x+x2,y+y2); }
}
class Main {
   static function main() {
       var p = new Point(1,2);
       var p2 = p.add(2,3);
       // то же самое, что написать :
       var p2 = new Point(p.x+2,p.y+3);
   }
}
</div>

Опять же, есть некоторые ограничения для "inline" функций:
* они не могут быть переопределены во время выполнения
* они не могут быть переопределены (override) в подклассах
* функция содержащая обращения к "super" или определяющая другую функцию не может быть "inline"
* если у "inline" функции есть аргументы, то порядок обработки аргументов не определён и некоторые аргументы могут быть вообще не обработаны, что хорошо, если только они не имеют каких-либо побочных эффектов
* если "inline" аргументы модифицируются в "inline" функции, то они в результате могут быть модифицированы и в оригинальной функции, например:

inline function setX(x) { x = 3; }
inline function foo() {
    var z = 0;
    setX(z);
    trace(z); // 3
}
</div>

* если inline возвращает значение, то только "финальные выражения return" принимаются, например:

inline function foo(flag) { return flag?0:1; } // принимается
inline function bar(flag) { if( flag ) return 0; else return 1; } // принимается
inline function baz(flag) { if( flag ) return 0; return 1; } // не принимается
</div>

Помимо этих нескольких ограничений, использование inline увеличивает размер компилированного / генерированного кода, но даёт большой прирос скорости исполнения маленьких методов.
Пожалуйста отметьте, что также возможно объявлять с ключевым словом inline и статические методы.