PT-BR/Argumentos Opcionais: Difference between revisions

From Multi Theft Auto: Wiki
Jump to navigation Jump to search
m (Lettify moved page BR/Argumentos Opcionais to Argumentos Opcionais/PT-BR: Deixar pesquisa pela página mais abrangente)
 

Latest revision as of 16:49, 21 February 2021

Argumentos Opcionais são argumentos que podem opcionalmente ser passados para qualquer função Lua, incluindo os internos do MTA: SA. Eles não são necessários para a função ser executada e podem ser desabilitados (valor == nil). Frequentemente, esse tipo de argumento não faz uma enorme diferença no comportamento da função.

É uma convenção Lua em que os argumentos escritos entre colchetes são opcionais, portanto, neste Wiki, você também pode encontrar funções com alguns argumentos entre colchetes. Isso significa que eles são opcionais e que não é necessário fornecê-los.

Vamos dar uma olhada nesta função:

vehicle createVehicle ( int model, float x, float y, float z, [ float rx, float ry, float rz ] )

Neste exemplo, rx, ry, and rz são argumentos opcionais, pois estão entre colchetes. Eles não precisam ser fornecidos para a função; será padronizado para nenhuma rotação em todos os eixos. Se fornecida, a função utilizará as rotações especificadas.

Por que argumentos opcionais são usados?

Na maioria das vezes, é chato ter que fornecer todos os argumentos de uma determinada função, especialmente se eles são os mesmos repetidamente. Os argumentos opcionais permitem que o scripter transmita apenas os dados realmente necessários para seu script, e isso ajuda a melhorar a legibilidade e o tamanho do código.

Usando os argumentos opcionais

O argumento opcional é utilizado como argumentos normais. A única diferença é que eles serão padronizados para um determinado valor, se não for fornecido (em outras palavras, se opcionalArgument == nil, será então opcionalArgument = defaultValue).

Um problema comum para programadores novos é quando eles desejam fornecer apenas um argumento opcional, sem definir os que estão antes dele. Bem, isso é realmente simples de "consertar". Normalmente, eles podem ser definidos como nil, então eles serão padronizados com seus valores correspondentes enquanto o scripter ainda é capaz de definir o que ele realmente deseja. Por exemplo, se você quer somente definir a rotação do eixo Z da função createVehicle (e não sabe que rx e ry tem como padrão, o zero):

vehicle createVehicle ( int model, float x, float y, float z, [ float rx, float ry, float rz ] )

Você pode usar:

local meuCarrinho = createVehicle( getVehicleModelFromName( "Infernus" ), 0, 0, 5, nil, nil, 180 )

E o resultado será o carro Infernus girado 180 graus no eixo Z, no centro do mapa.

Dialog-warning.png Aviso: Existem algumas funções nativas do MTA: SA que não seguem esta concordância, especialmente quando um argumento opcional está intimamente relacionado a outro (ex.: argumentos de cores nas funções DX e provavelmente outros): ao invés de substituir o valor nil, eles informam o erro 'bad argument' e não fazem nada. Sempre verifique se isso funciona com uma função antes de usá-la em um script.

Funções personalizadas com argumentos opcionais

Estas funções com argumentos opcionais ficam fáceis de ser gerenciada quando usado o if :

function aNotSoUsefulFunction( text )
    if type( text ) == "string" or type( text ) == "nil" then -- Verifica se os argumentos corretos foram fornecidos
        local realTextToOutput
        if text == nil then
            realTextToOutput = "Eu <3 argumentos opcionais" -- Se a variável text for igual a nil (não especificado), é usado um padrão
        else
            realTextToOutput = text -- Aqui é definido o texto que o usuário especificou, isso se ele definiu
        end
        outputChatBox( realTextToOutput ) -- Texto publicado no chat
    end
end

Você também pode usar short-circuit evaluation, se você preferir:

function aNotSoUsefulFunction( text )
    local realTextToOutput = ( type( text ) == "string" or type( text ) == "nil" ) and ( type( text ) == "string" and text or "Eu <3 argumentos opcionais" ) or nil
    if realTextToOutput then -- Verifica se há algo para postar no chat
        outputChatBox( realTextToOutput ) -- Poste o texto
    end
end