[ Обновленные темы · Новые сообщения · Участники · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Моддинг » 5.1. Уроки Lua » Урок 6. Функции. Локальные переменные. (О функциях. Некоторые хитроумные особенности.)
Урок 6. Функции. Локальные переменные.
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Итак, на данный момент мы уже умеем работать с переменными и знаем, что у них есть типы (nil, boolean, number, string, function, userdata, thread, table).
В прошлом уроке мы узнали, что такое таблицы (table), и узнали пару функций для работы с ними.
Первые четыре типа мы уже знаем из третьего урока.
Единственный тип, о котором я ещё вам не рассказал, но хочу - это функция(function).

Страшное пожалуй название "функция"... Но вы не пугайтесь, это всего лишь название =)
Я не буду рассказывать, что такое функция в математике(всякие там параболы и синусы), сдались они нам сейчас?
Скажу лучше, что это.
Функция в lua - это какая-то последовательность действий, у которой есть своё название.
Не воспринимайте это, как точное определение.

Представьте, что перед нами стоит задача написать на экране сумму, разность, произведение и частное двух чисел a и b. Её можно решить очень просто:

Code
a = 10
b = 2
print(a + b)
print(a - b)
print(a * b)
print(a / b)

Теперь вдруг кроме чисел a и b надо написать то же самое для чисел c и d. Решаем аналогично

Code
c = 5
d = 7
a = 10
b = 2

print(a + b)
print(a - b)
print(a * b)
print(a / b)

print(c + d)
print(c - d)
print(c * d)
print(c / d)

А теперь вдруг понадобилось сделать это для a и b, для a и c, для a и d, для b и c, для b и d, для c и d.
Пересилю свою лень и напишу решение:

Code
a = 10
b = 2
c = 5
d = 7

print(a + b)
print(a - b)
print(a * b)
print(a / b)

print(a + c)
print(a - c)
print(a * c)
print(a / c)

print(a + d)
print(a - d)
print(a * d)
print(a / d)

print(b + c)
print(b - c)
print(b * c)
print(b / c)

print(b + d)
print(b - d)
print(b * d)
print(b / d)

print(c + d)
print(c - d)
print(c * d)
print(c / d)

Страшно, не правда ли? Если бы приходилось писать так много кода, программирование было бы самым тупым и занудным занятием в мире. Но для таких лентяев, как я, то есть для программистов, придумали функции.

Покажу на примере, как они облегчат жизнь:

Code
function arifmetika(x, y)
   print(x + y)
   print(x - y)
   print(x * y)
   print(x / y)
end

a = 10
b = 2
c = 5
d = 7

arifmetika(a, b)
arifmetika(a, c)
arifmetika(a, d)
arifmetika(b, c)
arifmetika(b, d)
arifmetika(c, d)

Отлично выглядит по сравнению с прошлым кодом? А делает те же действия)

Всё легко - мы взяли и назвали 4 строчки кода словом арифметика, а потом вместо дублирования этих строк кода поставили их имя.

Теперь более формально. Функция описывается вот так:

Code
function имя_функции(параметры_через_запятую)
   код_функции
end

После того, как функция описана, можно её вызывать, то есть писать arifmetika(a, b), подставляя в неё параметры.
При этом выполнится код функции, с учётом, что вместо x подставлено значение a, то есть 10, а вместо y подставлено значение b, то есть 2.

Надеюсь это хороший пример и его достаточно, чтобы понять, что такое функция.

Есть ещё одна важная вещь - функция может возвращать какой-либо результат.
В самом простом случае это может быть математическое выражение.
Вот пример знакомой всем из математики параболы:

Code
function parabola(x)
   return 2*x^2+3*x+8
end

y = parabola(2)
print(y)

Этот код выведет на экран число 22.
Всё очень просто: наша Функция вернула 22 наружу и это значение записалось в y.

Чтобы вернуть результат функции используется слово return c возвращаемым значением.
При этом функция завершает свою работу.
Если значение отсутствует, то функция просто завершает свою работу.

Пример:

Code
function test()
   print(1)
   return
   print(2)
end

test()

На экран будет выведено только 1, потому что до строки print(2) выполнение не дойдёт.

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

Функция, возвращающая строку. Примимает на вход час, минуту и секунду, а возвращает понятную человеку текстовую строчку

Code
function format_time(h,m,s)
   return h..":"..m..":"..s;
end

print(format_time(10,12,48))

Эта функция распечатает на экране 10:12:48.

В lua есть чудесная возможность - писать в одной строке сразу два присваивания, смотрите:

Code
a, b = 2, 3

print(a)
print(b)

Пример выведет сначала 2, потом 3. В первой строке мы присвоили a первое значение, то есть 2, а переменной b - второе, то есть 3.
Можно писать после равно не только числа но и любые значения или переменные, в частности это можно использовать, чтобы обменять два значения:

Code
a, b = 2, 3

print(a)
print(b)

a, b = b, a

print(a)
print(b)

Тут выведется сначала 2 и 3, а потом, после обмена 3 и 2. Удобно..)

К чему я это всё? А к тому, что функция может возвращать не одно, а 2 значения, смотрите:

Code
function test()
   return 2, 3
end

a, b = test()

print(a)
print(b)

Результат примера аналогичен первому.

А это можно использовать, чтобы вычислить сразу 2 функции с помощью одной:

Code
function sincos(x)
   return math.sin(x), math.cos(x)
end

s, c = sincos(1.2)

print(s)
print(c)

Тут переменная s станет синусом 1.2, а переменная c - косинусом 1.2

Так, теперь ещё одна особенность работы с функциями.
Посмотрите на этот код:

Code
function test()
   a = 10
   b = 20
   return a + b
end

a = 15
b = 22

print(a)
print(b)

print(test())

print(a)
print(b)

Пример напечатает:

Code
15
22
30
10
20

Как видите, после работы функции test переменные a и b снаружи функции изменились.
Это называют Функцией с обратным эффектом. То есть функция возвращает какое-то значение (a + b), но снаружи при этом что-то ещё меняется.
Иногда это делать не надо. В данном примере, чтобы найти сумму 10 и 20 нам не надо использовать внешние переменные.
Поэтому придумали локальные переменные, которые видны только внутри функции.
Объявляется локальная переменная так же как и обычная, но с ключевым словом local:

Code
function test()
   local a = 10
   local b = 20
   return a + b
end

a = 15
b = 22

print(a)
print(b)

print(test())

print(a)
print(b)

В этом примере внешние переменные a и b не изменятся, и на экране появится

Code
15
22
30
15
22

Отлично, с этим разобрались.

Теперь немного посложнее. Помните список типов переменных lua? Один из них function.
Что же это значит? А это значит, что в переменной мы можем хранить функцию!
Смотрите, сейчас переделаю прошлый пример:

Code
function sincos(x)
   return math.sin(x), math.cos(x)
end

sc = sincos

s, c = sc(1.2)

print(s)
print(c)

Тут в переменную sc я записал функцию sincos.
Важно, что записи sc = sincos и sc = sincos() означают разное.
Первая запись - это записать в sc функцию sincos, вторая значит вызвать sincos() без параметров и записать в sc результат. Не путайте!

Если написать в последнем примере print(type(sc)), то на экране будет выведено слово function.
Это значит, что у sc тип данных function. Во как)

А что, если попробовать написать print(type(sincos))? Мы получим тот же результат - тип function.
Интересно, что же это получается, sincos - это переменная, которая хранит функцию? Да это так.

Поэтому функции можно объявлять другим способом, смотрите:

Code
test = function(x)
   return x
end

print(test(2))

Этот пример абсолютно идентичен такому:

Code
function test(x)
   return x
end

print(test(2))

Вот так.

А теперь давайте подумаем.
1) В lua есть тип переменных function.
2) В любой функции можно объявить локальную переменную

Так почему бы не объявить локальную функцию? Это можно сделать и очень даже не сложно, смотрите:

Code
function f(x, a, b, c)
   local function parabola(x)
    return a*x^2 + b*x+ c
   end
     
   return parabola(x)
end

print(f(2, 1, 2, 3))

Внутри функции f объявлена локальная Функция parabola, которая принимает на вход x. Так как она объявлена внутри функции f она знает числа a, b и c и может их использовать Для вычисления формулы.

С точки зрения программирования это красиво =) У всех людей нормальное представление о красоте, а у программистов такое вот....

Напоследок ещё раз напряжём мозги:
1) В lua есть тип переменных function.
2) Из функции можно возвращать любой тип данных, в том числе и function

Попробуем вернуть из функции функцию:

Code
function parabola(a, b, c)
   return function(x)
    return a*x^2 + b*x+ c
   end
end

f = parabola(1, 2, 3)

print(f(2))

Тут на выходе мы получаем функцию от x, которую потом мы можем использовать сколько угодно раз.

Надеюсь после прочтения всего этого вы не повредели свои мозги)))

Ну и самое последнее - в функциях не было бы смысла, если бы разработчики lua не сделали бы нам прилично много готовых функций для решения разнообразных задач.
Вы уже видели в прошлом уроке функции для работы с таблицами.
Как правило, все их функции орагнизованы в модули, к примеру модуль math - для работы с математикой, модуль table - для работы с таблицами, string - для строк и т.д.
И как вы наверно уже видели, вызов функции выглядит так:

Code
math.sin(10)

Похоже на таблицы, правда?

Всё дело в том, что в таблице можно хранить любые значения, в том числе и функции, поэтому можно писать так:

Code
my_module = {}
my_module.do_something = function()
   print("chto-to delaem")
end

my_module.do_something()

Это удобно для организации всех ваших функций в один модуль.



[Прошлый урок]|[Список уроков]|[Следующий урок]


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Drun
Хранители порядка
Сообщений: 1099
Реп: 23 / Инв: 14
Новый урок по Lua... На сайте w4tweaks... знаете что это означает? Главный админ вернулся!)
 
SW_Krash
Проверенные
Сообщений: 818
Реп: 28 / Инв: 7
прочитал начало... понял что из Герыча хороший препод =))) на днях начну луа заново вспоминать =)

Всё что ни делается, делается в Китае(SW_Krash, 2009)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
Я отрицаю вашу реальность и заменяю её своей!(Адам Севидж, 200x)
OFFTOP SWEAT OFFTOP(фольклор)

 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
О, отлично, тогда имеет смысл следующий урок придумывать?)

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
firsacho
Админы
Сообщений: 3812
Реп: 84 / Инв: 15
Quote (Герыч)
Страшно, не правда ли? Если бы приходилось писать так много кода, программирование было бы самым тупым и занудным занятием в мире. Но для таких лентяев, как я, то есть для программистов, придумали функции.
Покажу на примере, как они облегчат жизнь

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




Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005)
Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)

mod.worms.pro - мод Worms Renewation для Worms4
 
SW_Krash
Проверенные
Сообщений: 818
Реп: 28 / Инв: 7
хм... интересно... firsacho, ты тоже дочитал до места
Quote (Герыч)
Страшно, не правда ли? Если бы приходилось писать так много кода, программирование было бы самым тупым и занудным занятием в мире. Но для таких лентяев, как я, то есть для программистов, придумали функции.
Покажу на примере, как они облегчат жизнь

или всё осилил???

Герыч, по-поводу следующего урока подожди, лично мне пока не нужен =))) хотя у других может быть иное мнение =)


Всё что ни делается, делается в Китае(SW_Krash, 2009)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
Я отрицаю вашу реальность и заменяю её своей!(Адам Севидж, 200x)
OFFTOP SWEAT OFFTOP(фольклор)

 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Почему не нужен?

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
SW_Krash
Проверенные
Сообщений: 818
Реп: 28 / Инв: 7
я этот ещё не прочёл =) хотя если желание есть пиши =))) а ещё буду благодарен если подкорректируешь статью http://w3d.wiki-site.com/index.p....elay.29

она очень полезная... но формат гонит =)))



Всё что ни делается, делается в Китае(SW_Krash, 2009)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
Я отрицаю вашу реальность и заменяю её своей!(Адам Севидж, 200x)
OFFTOP SWEAT OFFTOP(фольклор)

 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Взаимно буду оч благодарен, если ты найдёшь хорошую вики, куда можно это перенести. Формат гонит из-за особенностей этой вики.

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
Проверенные
Сообщений: 2
Реп: 0
Герыч, а когда будет следующий урок?
 
firsacho
Админы
Сообщений: 3812
Реп: 84 / Инв: 15
CRYZenD, ну т.к. этот урок был 2 года назад, логично, что нового не ожидается)
Рекомендую продолжить изучение по этой ссылке: http://w3d.wiki-site.com/index.p....%8B_Lua А вопросы если что - на наш форум.




Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005)
Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)

mod.worms.pro - мод Worms Renewation для Worms4
 
Проверенные
Сообщений: 22
Реп: 11
Сам в шоке от того, что выучил луа за один день без всяких туторов...
 
firsacho
Админы
Сообщений: 3812
Реп: 84 / Инв: 15
FunnyGame, молоток) будут еще моды)?



Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005)
Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007)
Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)

mod.worms.pro - мод Worms Renewation для Worms4
 
Проверенные
Сообщений: 22
Реп: 11
Цитата firsacho ()
будут еще моды)?


Конеш, отдых скоро кончится

Добавлено (30.03.2017, 07:52:09)
---------------------------------------------
Просто вормс щас поднадоел, лень моды делать. Нужно чтобы желание появилось

 
Форум » Моддинг » 5.1. Уроки Lua » Урок 6. Функции. Локальные переменные. (О функциях. Некоторые хитроумные особенности.)
  • Страница 1 из 1
  • 1
Поиск: