Сейчас 07:22:29 Воскресенье, 14 августа, 2022 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [vJass]Библиотеки и области. Приватные конструкции (Урок 2)
[vJass]Библиотеки и области. Приватные конструкции
DragoNДата: Воскресенье, 19 Декабря 2010, 18:16:01 | Сообщение # 1
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Итак, мы добрались к одному из самых интересных возможностей vJass


Библиотеки


Библиотека (library) - отрезок кода, который будет объявлен независимо от его положения в коде сразу после объявление глобальных переменных и выше

Объявляется так:

Code
library <имя>
    //тело библиотеки, сюда могут входить структуры, функции и т.д
endlibrary

Так же библиотеки могут ссылаться друг на друга:

Code
library A uses B
endlibrary

Это значит, что в библиотеки second содержится функция, вызывающая функцию в библиотеке A, следовательно библиотека B будет размещена выше по коду.

Пример:

Code
library A requires B
    function SomeFunc takes nothing returns nothing
     call MainTest()
    endfunction
endlibrary

library B
    function MainTest takes nothing returns nothing
     call DoSomething()
    endfunction
endlibrary

Место uses может быть использовано requires или needs, все три обозначения компилируются одинаково.
Также возможна следующая конструкция:
library A uses B, C

Это значит что библиотека A будет объявлена ниже B и C.

Важно отметить, что если библиотека A будет ссылаться на библиотеку B, а B на А это приведет к синтаксической ошибке.

Самоинициализация библиотек

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

Для этого используется такая конструкция:

Code
library A initializer Init
endlibrary

Это значит, что в функцию main() (для тех кто не знает она запускается при загрузке карты) будет включен запуск функции Init в отдельном потоке.

Пример:

Code
library A initializer Init

    function Init takes nothing returns nothing
     set udg_c = GetSpellAbilityUnit()
    endfunction

endlibrary

Надо заметить, что инициализация библиотек объявлена выше инициализации глобальных переменных.



Области


Области (scope) - по сути те же библиотеки, с различием в том, что они будут объявлены не вверху кода, а на своем реальном месте

Области объявляются так же, как и библиотеки но с отличием в ключевом слове(вместо library используется scope)



Приватные конструкции



Как я и обещал я опишу приватные конструкции(что это и зачем это надо). Приступим :)

Приватные конструкции работают в областях и библиотеках (за исключением приватных переменных в структурах)

Приватные переменные

Приватные переменные обычно используются что бы не было повторяющихся названий. Например:

У нас есть код:

Первый случай:

Code
globals
unit u
endglobals

Второй случай:

Code
library spell    
globals
private unit u
endglobals

endlibrary

В первом случае(вне библиотеки) мы сможем обращаться к переменной u с любой части кода, однако во втором случае мы можем обращаться к переменной только внутри библиотеки, тем самым ограничив область видимости переменной.

Code
library spell    
globals
private unit u
endglobals

function myfunc takes nothing returns nothing
set u=GetSpellAbilityUnit()
endfunction

endlibrary

Этим кодом мы установим значение переменной u из категории globals нашей библиотеки.

Такой же трюк можно провести и функциями:

Code
library spell    
globals
private unit u
endglobals

private function myfunc takes nothing returns nothing
set u=GetSpellAbilityUnit()
endfunction

endlibrary

Теперь при попытке обратится к функции myfunc извне мы получим ошибку

Приватные конструкции.

Используется ключевое слово public и что бы обратится к нужному объекту используем
<Имя области/библиотеки>_<имя нужного объекта>

Пример:
l

Code
ibrary spell    
globals
unit u
endglobals

public function myfunc takes nothing returns nothing
set u=GetSpellAbilityUnit()
endfunction

endlibrary

Обращение будет так
call spell_myfunc()


Заключение



Ну вот и подошла к концу наша лекция. В следующей(и возможно финальной) мы познакомимся с макросами. Задание всё тоже, но обновить свой спелл с использованием вышеописанные фишек.
Что не ясно - спрашиваем.


El Psy Congroo
 

SirNikolasДата: Понедельник, 20 Декабря 2010, 14:02:53 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
А чем "public function" отличается от просто "function"? К ним обеим можно обратиться извне.

 

BinGOДата: Понедельник, 20 Декабря 2010, 15:00:19 | Сообщение # 3
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
А тут новый урок) Времени сегодня осталось маловато, завтра прочту и отпишу.
 

DragoNДата: Понедельник, 20 Декабря 2010, 17:40:50 | Сообщение # 4
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Quote (SirNikolas)
А чем "public function" отличается от просто "function"? К ним обеим можно обратиться извне.

тем что к ней будет обращение через <Имя библиотеки>_<имя функции>


El Psy Congroo
 

dkfl10011Дата: Пятница, 14 Сентября 2012, 20:41:37 | Сообщение # 5
1 уровень
Группа: Пользователи
Сообщений: 8
Награды: 0
Репутация: 4
Блокировки:
Хрень!!!
Адольф же перевёл мануал по vJass и грамотно темболее нафиг создавать статьи?!
 

[DS]Дата: Пятница, 14 Сентября 2012, 21:11:57 | Сообщение # 6
9 уровень
Группа: Проверенные
Сообщений: 1116
Награды: 0
Репутация: 527
Блокировки:
некропостер херов

 

HexingДата: Суббота, 15 Сентября 2012, 09:58:21 | Сообщение # 7
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Quote (DragoN)
ем что к ней будет обращение через <Имя библиотеки>_<имя функции>

это какраз таки private, бесполезно спорить с сиром


 

Ty3uKДата: Суббота, 15 Сентября 2012, 10:23:36 | Сообщение # 8
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
приват через __ или ___
всегда по-разному


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

HexingДата: Суббота, 15 Сентября 2012, 11:15:18 | Сообщение # 9
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Ty3uK, ну вот теперь я сам не уверен, хотя к чему это обсуждать, сирушка итак всё знает

 

Ty3uKДата: Суббота, 15 Сентября 2012, 11:20:51 | Сообщение # 10
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
я уверен
впрочем придет Ник и рассудит нас :)


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Суббота, 15 Сентября 2012, 13:09:00 | Сообщение # 11
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
А теперь посмотрите на дату моего поста. :)
Эта тема изначально в "Классе Б" висела. Или тогда еще В был картостроительным?




Сообщение отредактировал SirNikolas - Суббота, 15 Сентября 2012, 13:09:59
 

Ty3uKДата: Суббота, 15 Сентября 2012, 13:10:09 | Сообщение # 12
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
я знаю, я наоборот сказал, что Драгон прав
ну и рассуди теперь нас


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Суббота, 15 Сентября 2012, 13:13:10 | Сообщение # 13
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Code
library MyLib
    function SimpleFunc takes nothing returns nothing
    endfunction

    public function PublicFunc takes nothing returns nothing
    endfunction

    private function PrivateFunc takes nothing returns nothing
    endfunction
endlibrary
Code
//library MyLib begins:
function SimpleFunc takes nothing returns nothing
endfunction

function MyLib_PublicFunc takes nothing returns nothing
endfunction

//Имя каждый раз разное
function MyLib__PrivateFunc takes nothing returns nothing
endfunction
//library MyLib ends


 

Ty3uKДата: Суббота, 15 Сентября 2012, 13:14:21 | Сообщение # 14
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
я был прав fuckyeah

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [vJass]Библиотеки и области. Приватные конструкции (Урок 2)
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2022 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz