Итак, на данный момент мы уже умеем работать с переменными и знаем, что у них есть типы (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)
Страшно, не правда ли? Если бы приходилось писать так много кода, программирование было бы самым тупым и занудным занятием в мире. Но для таких лентяев, как я, то есть для программистов, придумали функции.
Покажу на примере, как они облегчат жизнь:
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()
Это удобно для организации всех ваших функций в один модуль.
прочитал начало... понял что из Герыча хороший препод =))) на днях начну луа заново вспоминать =) Всё что ни делается, делается в Китае(SW_Krash, 2009) Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008) Я отрицаю вашу реальность и заменяю её своей!(Адам Севидж, 200x) OFFTOP SWEAT OFFTOP(фольклор)
Страшно, не правда ли? Если бы приходилось писать так много кода, программирование было бы самым тупым и занудным занятием в мире. Но для таких лентяев, как я, то есть для программистов, придумали функции. Покажу на примере, как они облегчат жизнь
Вот когда читаешь такой текст, еще раз убеждаешься что в Герыче запрятан талант писателя... ему надо попробовать статьи для научных журналов писать... довольно скучный урок, но текст его заметно оживляет)
Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005) Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007) Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
хм... интересно... firsacho, ты тоже дочитал до места
Quote (Герыч)
Страшно, не правда ли? Если бы приходилось писать так много кода, программирование было бы самым тупым и занудным занятием в мире. Но для таких лентяев, как я, то есть для программистов, придумали функции. Покажу на примере, как они облегчат жизнь
или всё осилил???
Герыч, по-поводу следующего урока подожди, лично мне пока не нужен =))) хотя у других может быть иное мнение =)
Всё что ни делается, делается в Китае(SW_Krash, 2009) Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008) Я отрицаю вашу реальность и заменяю её своей!(Адам Севидж, 200x) OFFTOP SWEAT OFFTOP(фольклор)
Всё что ни делается, делается в Китае(SW_Krash, 2009) Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008) Я отрицаю вашу реальность и заменяю её своей!(Адам Севидж, 200x) OFFTOP SWEAT OFFTOP(фольклор)
Взаимно буду оч благодарен, если ты найдёшь хорошую вики, куда можно это перенести. Формат гонит из-за особенностей этой вики. ________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
CRYZenD, ну т.к. этот урок был 2 года назад, логично, что нового не ожидается) Рекомендую продолжить изучение по этой ссылке: http://w3d.wiki-site.com/index.p....%8B_Lua А вопросы если что - на наш форум.
Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005) Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007) Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005) Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007) Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
Добавлено (30.03.2017, 07:52:09) --------------------------------------------- Просто вормс щас поднадоел, лень моды делать. Нужно чтобы желание появилось