Skip to content

Commit

Permalink
include.md
Browse files Browse the repository at this point in the history
  • Loading branch information
nazarpunk committed Dec 16, 2024
1 parent db69399 commit 10f0848
Show file tree
Hide file tree
Showing 4 changed files with 173 additions and 21 deletions.
2 changes: 1 addition & 1 deletion Writerside/topics/fun-arg.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,5 @@ void [[[main|main.md]]](){
}
```

> Начальное значение аргумента может включать переменные или вызов функций только если они доступны из глобальной
> Начальное значение аргумента может включать переменные или вызов функций только если они доступны из текущей
> области видимости.
77 changes: 76 additions & 1 deletion Writerside/topics/funcdef.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,79 @@ void [[[main|main.md]]](){
A@ F = @B; // Объявляем переменную где тип является сигнатурой функции
D(@F); // Передаём переменную в функцию
}
```
```

## Встроенные сигнатуры {id="built-in"}

По умолчанию в игре определены две сигнатуры, которые используются для внутриигровых триггеров и таймеров:

```C#
void CallbackFunc();
bool BoolexprFunc();
```

## Методы класса {id="method"}

Для того, чтоб передать [метод](method.md) класса [аргументом](fun-arg.md) необходимо вручную привязать экземпляр класса
к методу:

```C#
class A {
A() [[[delete|constructor-default.md#delete]]];

A(string name){
[[[this|this.md]]].name = name;
}

string name;

bool m(){
return name == "2";
}
}

void [[[main|main.md]]](){
A a1("1");
A a2("2");

BoolexprFunc @f2 = BoolexprFunc(a2.m); // Привязываем экземпляр класса к методу
print(f2() + "\n"); // true
}
```

### Утечка {id="leak"}

> Функции из API игры после завершения работы не освобождают ссылку на класс и предотвращают его удаление штатным
> сборщиком мусора.
>
{style="warning"}

В данном примере сработает только один [деструктор](destructor.md):

```C#
class A {
A() [[[delete|constructor-default.md#delete]]];

A(string name){
[[[this|this.md]]].name = name;
}

[[[~|destructor.md]]]A(){
print(name);
}

string name;

void m(){}
}

void [[[main|main.md]]](){
A a1("1");
A a2("2");

TimerStart(CreateTimer, 0.f, false, CallbackFunc(a2.m));
}
// Деструктор для a2 вызван не будет
```

107 changes: 92 additions & 15 deletions Writerside/topics/include.md
Original file line number Diff line number Diff line change
@@ -1,42 +1,119 @@
# include

Вставляет код из внешнего файла. Путь относителен для того файла, в котором используется `include`.
Подключает код из внешнего файла. Путь относителен тому файлу, в котором используется `include`.

```C#
#include "Scripts\\blizzard.as"
```

> Для того, чтоб выйти в родительскую директорию используется специальное имя `..`.

Разрешено использовать только в корне файла или в [пространстве имён](namespace.md).

<deflist>
<def>
<title><code>A.as</code></title>
<code-block lang="c++">
int A = 1;
</code-block>
<title>Пример</title>

`A.as`
```c#
string A = "A";
```

`war3map.as`

```c#
#include "A.as"

void [[[main|main.md]]](){
// #include "A.as" // Ошибка! Размещение include в функции запрещено!
print(A); // A
}
```
</def>
</deflist>

## Разрешение {id="resolve"}

Функционал подключения никак не модифицирует исходную логику и видимость. Его задача состоит в том, чтоб указать какие
файлы участвуют в компиляции.

Один и тот же файл может быть подключён только единожды. Повторное указание файла для подключения не вызовет ошибки и
будет проигнорировано.

<deflist>
<def>
<title><code>main.as</code></title>
<code-block lang="c++">
<![CDATA[
<title>Пример</title>

`C.as`
```c#
string C = "C";
```

`B.as`
```c#
#include "C.as"
string B = "B";
```

`A.as`
```c#
#include "B.as"
string A = "A";
```

`war3map.as`

```c#
#include "A.as"
#include "С.as" // Повторное подключение юудет проигнорировано и не вызовет ошибки
void [[[main|main.md]]](){
print(A); // A
print(B); // B
print(C); // C
}
```
</def>
</deflist>

## Пространство имён {id="namespace"}

Использование подключения внутри [пространства имён](namespace.md#multi) служит только для удобства и не несёт никакого
дополнительного смысла с точки зрения работы с кодом.

namespace N {
#include "A.as"

<deflist>
<def>
<title>Пример</title>

`main.as`
```c#
[[[namespace|namespace.md]]] Map {
void main(){
print("main");
}
}
```

`config.as`
```c#
[[[namespace|namespace.md]]] Map {
void config(){
print("config");
}
}
```

`war3map.as`
```c#
[[[namespace|namespace.md]]] Map {
#include "main.as" // Подключаем внутри [[[пространства имён|namespace.md]]]
}
#include "config.as" // Подключаем просто в корне файла
void [[[main|main.md]]](){
print(A);
print(N::A);
Map::main(); // main
Map::config(); // config
}
]]>
</code-block>
```
</def>
</deflist>
8 changes: 4 additions & 4 deletions Writerside/topics/namespace.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Пространство имён
# namespace

<a href="https://www.angelcode.com/angelscript/sdk/docs/manual/doc_global_namespace.html"/>

Механизм, который позволяет организовать код в логические группы. Позволяет избежать конфликтов имён при разрастании
кодовой базы, особенно при использовании внешних зависимостей.
Пространство имён — механизм, который позволяет организовать код в логические группы. Позволяет избежать конфликтов имён
при разрастании кодовой базы, особенно при использовании внешних зависимостей.

Для доступа к объектам внутри пространства имён используется оператор `::`:

Expand Down Expand Up @@ -111,6 +111,6 @@ void [[[main|main.md]]](){
}
```

> Этот функционал удобно использовать совместно с [](include.md) для разбиения кода в разные файлы.
> Этот функционал удобно использовать совместно с [include](include.md#namespace) для разбиения кода в разные файлы.

0 comments on commit 10f0848

Please sign in to comment.