WarCraft 3: 11. Дополнительные возможности

WurstScript

Перегрузка функций

Перегрузка функций позволяет вам иметь несколько функций с одним именем. Компилятор будет сам принимать решение, какая функция должна быть вызвана, исходя из ее формальных параметров.
Wurst использует довольно простую форму перегрузки. Если в области видимости обнаруживается функция с идентичными параметрами, производится ее вызов. Если таких функций более одной - компилятор выдаст ошибку.
Обратите внимание, это отличается от большинства других языков программирования, где вызывается функция с наиболее подходящим набором параметров, вместо предоставления сообщения об ошибке.
function unit.setPosition(vec2 pos)
    ...

function unit.setPosition(vec3 pos)
    ...

function real.add(real r)
    ...

function real.add(real r1, real r2)
    ...
Это работает, поскольку типы формальных параметров или их количество различается. Во время компиляции, будет установлен вызов той функции, чей список формальных параметров удовлетворяет передаваемым значениям.
function real.add(real r1)
    ...

function real.add(real r1) returns real
    ...
Это не работает, поскольку различается только тип возвращаемого значения.
class A
class B extends A

function foo(A c)
    ...

function foo(B c)
    ...

init
    foo(new B)
Это тоже не работает, поскольку тип B это подтип класса A. Если вы попытаетесь вызвать функцию foo, с передачей значения типа B, обе функции будут способны его принять. Прочие языки программирования просто выберут функцию с наиболее подходящим типом, однако Wurst не поддерживает подобного механизма.
Если же классы A и B не будут являться родственными, перегрузка функции пройдет успешно.

Перегрузка операторов

Перегрузка операторов позволяет изменить поведение операторов +, -, * и /, для пользовательских типов.
Быстрый пример из стандартной библиотеки (Vectors.wurst)
// перегрузка оператора "+" для кортежа vec3
public function vec3.op_plus( vec3 v ) returns vec3
    return vec3(this.x + v.x, this.y + v.y, this.z + v.z)

// Пример использования
vec3 a = vec3(1.,1.,1.)
vec3 b = vec3(1.,1.,1.)
// Без перегрузки оператора
vec3 c = a.add( b )
// С перегрузкой оператора
vec3 c = a + b
Вы можете перегрузить операторы существующих типов с применением расширяющих функций или в методах классов. Для перегрузки операторов используется специальные имена для функций
+  "op_plus"
-  "op_minus"
*  "op_mult"
/  "op_divReal"

Просмотров: 71

Комментарии пока отсутcтвуют