Índice
As funções são o principal mecanismo para a abstração de declarações e expressões em Lua, eles podem realizar tarefas específicas, que são geralmente chamadas de procedimentos ou sub-rotinas em outras línguas.As funções na maioria das vezes são escritas com parênteses e uma lista de argumentos que permitirão realizar uma ação específica, podendo ser que essas funções não necessitem de argumentos, porém os parênteses devem ser especificados, vamos ver um exemplo de funções que usamos como expressões dentro Lua:
print "Hello World" print ("Hello World") dofile 'file.lua' dofile ('file.lua') print [[multi-line array msg]] print ([[multi-line array msg]]) f { var1 = 17, var2 = 30} f ({var1 = 17, var2 = 30}) tipo {} tipo ({})De acordo com o exemplo, pudemos escrever as funções das duas maneiras, sendo igualmente válidas.
Um programa em Lua Você pode usar funções definidas em C e na própria linguagem, por exemplo, todas as funções padrão na biblioteca de Lua são escritos em C, o que não é relevante para desenvolvedores, já que a invocação de ambos não faz diferença.
Sabendo disso, a definição não difere de outras linguagens, a sintaxe convencional de uma função é regida pelo nome da função, uma lista de parâmetros e o corpo da função, que é uma lista de declarações, vamos ver um exemplo para ilustrar o que foi explicado:
operação da função (var) soma local = 0 soma = var + 6 retorno soma finalJá temos nossa função, porém dessa forma não é muito útil, pois precisa ser invocada enviando o parâmetro de que precisa, para isso podemos adicionar mais uma linha ao nosso código para invocá-la:
função operação (var) soma local = 0 soma = var + 6 retorno soma final impressão (operação (57))Se executarmos nosso exemplo em nosso terminal, podemos ver como nosso programa recebe o parâmetro e de acordo com as operações definidas em nossa função, ele retorna um valor:
PROLONGAR
function multiple_function (a, b) retorna a ou b endVamos ver como na parte do código a seguir chamamos a função com parâmetros diferentes e, no lado direito, como a atribuição é realizada:
f (8) a = 8, b = nil f (8, 15) a = 8, b = 15 f (8, 15, 4) a = 8, b = 15 (o valor 4 é descartado)Embora esse comportamento possa levar a erros de programação, também é útil, especialmente para argumentos padrão.
Um recurso não convencional, mas bastante útil do Lua, é a capacidade de retornar vários resultados, até mesmo funções de linguagem predefinidas podem fazer isso. Um exemplo disso é a função string.find, que procura um padrão de ocorrência em uma determinada string, esta função retorna dois índices, o primeiro é o índice onde este padrão começa e o segundo é onde ele termina, vamos ver um exemplo prático do uso desta função que podemos fazer perfeitamente em nosso console interativo:
função valor máximo (a) mínimo local = 1 local m = a [mínimo] para i, val em ipairs (a) faça se val> m então mínimo = i; m = val end end return m, mínimo final de impressão (valor máximo ({8,10,23,12,5}))Como podemos ver, nossa função é bastante simples e em nosso retorno ela retorna dois valores, que neste caso de acordo com o que estamos enviando devemos retornar 23 como o maior número e 3 como a posição, vejamos:
PROLONGAR
função example_function (…) local s = 0 para i, v em ipairs {…} do s = s + v end return s end print (example_function (8, 19, 30, 14, 10))Se formos observadores na definição da nossa função, temos três pontos (… ) dentro dos parênteses, isso indica que nossa função aceita um número variável de argumentos, e quando a função é chamada todos os argumentos enviados são coletados internamente e depois processados com a função ipairsVamos ver a saída de nossa função que é responsável por adicionar todos os argumentos enviados a ela:
PROLONGAR
Enviando argumentos em Lua é posicional, ou seja, quando invocamos uma função, esses argumentos correspondem aos parâmetros de acordo com suas posições, o primeiro argumento corresponde ao primeiro parâmetro e assim por diante, embora às vezes não faça mal especificar os argumentos pelo nome.
Esta funcionalidade é semelhante aos argumentos variáveis, porém ao definir os nomes para nossos argumentos, tratá-los é muito mais simples, onde apenas usando uma tabela ou arranjo podemos fazer esta funcionalidade, algo que é muito útil se nossa função usar algum desses parâmetros opcionalmente, vamos ver a seguinte chamada para uma função que recebe uma certa quantidade de parâmetros para construir uma janela:
criar_janela {x = 0, y = 0, largura = 0, altura = 200, título = 'Janela Lua', fundo = "azul", bordas = verdadeiro}Desta forma, a função create_window Você está livre para verificar esses argumentos por nome, se desejar, vamos ver como recebemos esses argumentos em nossa função e o que podemos fazer com eles:
função create_window (options) - verificar as opções obrigatórias se tipo (options.title) ~ = "string" then error ("sem título") elseif type (options.width) ~ = "número" then error ("sem medida de largura" ) elseif type (options.height) ~ = "number" then error ("sem medição de altura") end - aplicamos as opções create_window (options.title, options.x ou 0, options.y ou 0, options .width, options.height, options.background ou "white", options.edges) EndComo podemos ver, as possibilidades em nossos programas são muito maiores com esta funcionalidade e, embora este exemplo seja ilustrativo, ele nos permite ver como podemos aplicar os argumentos nomeados dentro de nossas funções.
É assim que terminamos este tutorial, onde aprendemos como lidar com funções em Lua, indo da sintaxe convencional que podemos encontrar em outras linguagens às características da linguagem como os múltiplos resultados, argumentos variáveis e a possibilidade de nomear os argumentos que enviamos para nossas funções. Desta forma, adicionando muito mais poder aos nossos programas, incluindo esses tipos de recursos e mantendo a simplicidade com que Lua estamos acostumados a isso.Gostou e ajudou este tutorial?Você pode recompensar o autor pressionando este botão para dar a ele um ponto positivo