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 не будут являться родственными, перегрузка функции пройдет успешно.

Передача множества аргументов функции

Функция может принимать произвольное количество параметров заданного типа. Эта возможность позволяет избежать шаблонного кода и реализует лучшее API. Доступ ко множеству переданных аргументов внутри функции может быть получен посредством цикла for. Пример:
function asNumberList(vararg int numbers) returns LinkedList<int>
	let list = new LinkedList<int>()
	for number in numbers
		list.add(number)
	return list

init
	asNumberList(1,2,3)
	asNumberList(44,14,651,23)
	asNumberList(10)
Каждый вызов функции asNumberList внутри блока инициализации примера выше допустим. Мы можем передать любое количество целочисленных переменных, при этом нам достаточно одной реализации данной функции.

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

Перегрузка операторов позволяет изменить поведение операторов +, -, * и /, для пользовательских типов.
Быстрый пример из стандартной библиотеки (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"

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

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