Roblox usa a linguagem de programação Luau. Os seguintes exemplos de código e tabelas indicam algumas das diferenças entre as sintaxes do C# e do Luau.
Quebras de linha
Você não precisa de ponto e vírgula no Luau, mas eles não quebram a sintaxe.
Palavras-chave reservadas
A tabela a seguir possui as palavras-chave reservadas do Luau mapeadas para suas equivalentes em C#. Observe que ela não mostra todas as palavras-chave do C#.
| Luau | C# |
|---|---|
| and | |
| break | break |
| do | do |
| if | if |
| else | else |
| elseif | else if |
| then | |
| end | |
| true | true |
| false | false |
| for | for ou foreach |
| function | |
| in | in |
| local | |
| nil | null |
| not | |
| or | |
| repeat | |
| return | return |
| until | |
| while | while |
Comentários
-- Comentário de uma linha
--[[ Saída resultante:
Comentário de bloco
--]]// Comentário de uma linha
/*
Comentário de bloco
*/Strings
-- String de várias linhas
local multiLineString = [[Esta é uma string que,
quando impressa, aparece
em várias linhas]]
-- Concatenação
local s1 = "Esta é uma string "
local s2 = "feita com duas partes."
local endString = s1 .. s2// String de várias linhas
string multiLineString1 = "Esta é uma string que,\nquando impressa, aparece\n em várias linhas.";
string multiLineString2 = @"Esta é uma string que,
quando impressa, aparece
em várias linhas";
// Concatenação
string s1 = "Esta é uma string ";
string s2 = "feita com duas partes.";
string endString = s1 + s2;Tabelas
Para saber mais sobre tabelas em Luau, veja Tabelas.
Tabelas de dicionário
Você pode usar tabelas no Luau como dicionários, assim como no C#.
local dictionary = {
val1 = "isto",
val2 = "é"
}
print(dictionary.val1) -- Saída 'isto'
print(dictionary["val1"]) -- Saída 'isto'
dictionary.val1 = nil -- Remove 'val1' da tabela
dictionary["val3"] = "um dicionário" -- Sobrescreve 'val3' ou define um novo par chave-valorDictionary<string, string> dictionary = new Dictionary<string, string>()
{
{ "val1", "isto" },
{ "val2", "é" }
};
Console.WriteLine(dictionary["val1"]); // Saída 'isto'
dictionary.Remove("val1"); // Remove 'val1' do dicionário
dictionary["val3"] = "um dicionário"; // Sobrescreve 'val3' ou define um novo par chave-valor
dictionary.Add("val3", "um dicionário"); // Cria um novo par chave-valorTabelas indexadas numericamente
Você pode usar tabelas no Luau como arrays, assim como no C#. Os índices começam em 1 no Luau e 0 no C#.
local npcAttributes = {"forte", "inteligente"}
print(npcAttributes[1]) -- Saída 'forte'
print(#npcAttributes) -- Saída do tamanho da lista
-- Adicionando à lista
table.insert(npcAttributes, "humilde")
-- Outra forma...
npcAttributes[#npcAttributes+1] = "humilde"
-- Inserindo no início da lista
table.insert(npcAttributes, 1, "corajoso")
-- Remover item em um índice dado
table.remove(npcAttributes, 3)List<string> npcAttributes = new List<string>{"forte", "inteligente"};
Console.WriteLine(npcAttributes[0]); // Saída 'forte'
Console.WriteLine(npcAttributes.Count); // Saída do tamanho da lista
// Adicionando à lista
npcAttributes.Add("humilde");
// Outra forma...
npcAttributes.Insert(npcAttributes.Count, "humilde");
// Inserindo no início da lista
npcAttributes.Insert(0, "corajoso");
// Remover item em um índice dado
npcAttributes.RemoveAt(2);Operadores
Operadores condicionais
| Operador | Luau | C# |
|---|---|---|
| Igual a | == | == |
| Maior que | > | > |
| Menor que | < | < |
| Maior ou igual a | >= | >= |
| Menor ou igual a | <= | <= |
| Diferente | ~= | != |
| E | and | && |
| Ou | or | || |
Operadores aritméticos
| Luau | C# | |
|---|---|---|
| Adição | + | + |
| Subtração | - | - |
| Multiplicação | * | * |
| Divisão | / | / |
| Módulo | % | % |
| Exponenciação | ^ | ** |
Variáveis
No Luau, as variáveis não especificam seu tipo quando você as declara. Variáveis do Luau não têm modificadores de acesso, embora você possa prefixar variáveis "privadas" com um sublinhado para legibilidade.
local stringVariable = "valor"
-- Declaração "Pública"
local variableName
-- Declaração "Privada" - interpretada da mesma forma
local _variableNamestring stringVariable = "valor";
// Declaração pública
public string variableName;
// Declaração privada
string variableName;Escopo
No Luau, você pode escrever variáveis e lógica em um escopo mais restrito do que sua função ou classe, aninhando a lógica dentro das palavras-chave do e end, semelhante às chaves {} no C#. Para mais detalhes, veja Escopo.
local outerVar = 'Texto de escopo externo'
do
-- Modifica 'outerVar'
outerVar = 'Texto modificado de escopo interno'
-- Introduz uma variável local
local innerVar = 'Texto de escopo interno'
print('1: ' .. outerVar) -- imprime "1: Texto modificado de escopo interno"
print('2: ' .. innerVar) -- imprime "2: Texto de escopo interno"
end
print('3: ' .. outerVar) -- imprime "3: Texto modificado de escopo interno"
// Tentar imprimir 'innerVar' aqui falhariavar outerVar = "Texto de escopo externo";
{
// Modifica 'outerVar'
outerVar = "Texto modificado de escopo interno";
// Introduz uma variável local
var innerVar = "Texto de escopo interno";
Console.WriteLine("1: " + outerVar); // imprime "1: Texto modificado de escopo interno"
Console.WriteLine("2: " + innerVar); // imprime "2: Texto de escopo interno"
}
Console.WriteLine("3: " + outerVar); // imprime "3: Texto modificado de escopo interno"
// Tentar imprimir 'innerVar' aqui falhariaDeclarações condicionais
-- Uma condição
if boolExpression then
doSomething()
end
-- Múltiplas condições
if not boolExpression then
doSomething()
elseif otherBoolExpression then
doSomething()
else
doSomething()
end// Uma condição
if (boolExpression) {
doSomething();
}
// Múltiplas condições
if (!boolExpression) {
doSomething();
}
else if (otherBoolExpression) {
doSomething();
}
else {
doSomething();
}Operador condicional
local max = if x > y then x else yint max = (x > y) ? x : y;Laços
Para saber mais sobre laços em Luau, veja Estruturas de Controle.
Laços enquanto e repetir
while boolExpression do
doSomething()
end
repeat
doSomething()
until not boolExpressionwhile (boolExpression) {
doSomething();
}
do {
doSomething();
} while (boolExpression);Laços para
-- Laço para frente
for i = 1, 10 do
doSomething()
end
-- Laço reverso
for i = 10, 1, -1 do
doSomething()
end// Laço para frente
for (int i = 1; i <= 10; i++) {
doSomething();
}
// Laço reverso
for (int i = 10; i >= 1; i--) {
doSomething();
}local abcList = {"a", "b", "c"}
for i, v in ipairs(abcList) do
print(v)
end
local abcDictionary = { a=1, b=2, c=3 }
for k, v in pairs(abcDictionary) do
print(k, v)
endList<string> abcList = new List<string>{"a", "b", "c"};
foreach (string v in abcList) {
Console.WriteLine(v);
}
Dictionary<string, int> abcDictionary = new Dictionary<string, int>
{ {"a", 1}, {"b", 2}, {"c", 3} };
foreach (KeyValuePair<string, int> entry in abcDictionary) {
Console.WriteLine(entry.Key + " " + entry.Value);
}Luau também suporta iteração generalizada, o que simplifica ainda mais o trabalho com tabelas.
Funções
Para saber mais sobre funções em Luau, veja Funções.
Funções genéricas
-- Função genérica
local function increment(number)
return number + 1
end// Função genérica
int increment(int number) {
return number + 1;
}Número de argumentos variáveis
-- Número de argumentos variáveis
local function variableArguments(...)
print(...)
end// Número de argumentos variáveis
void variableArguments(params string[] inventoryItems) {
foreach (string item in inventoryItems) {
Console.WriteLine(item);
}
}Argumentos nomeados
-- Argumentos nomeados
local function namedArguments(args)
return args.name .. "'s birthday: " .. args.dob
end
namedArguments{name="Bob", dob="1/4/2000"}// Argumentos nomeados
string namedArguments(string name, string dob) {
return name + "'s birthday: " + dob;
}
namedArguments(name: "Bob", dob: "1/4/2000");Estruturas try-catch
local function fireWeapon()
if not weaponEquipped then
error("Nenhuma arma equipada!")
end
-- Prosseguir...
end
local success, errorMessage = pcall(fireWeapon)
if not success then
print(errorMessage)
endvoid fireWeapon() {
if (!weaponEquipped) {
// Usar uma exceção definida pelo usuário
throw new InvalidWeaponException("Nenhuma arma equipada!");
}
// Prosseguir...
}
try {
fireWeapon();
} catch (InvalidWeaponException ex) {
// Um erro foi levantado
}