Si Luau intenta usar un valor o variable en una operación, como aritmética, concatenación o asignación, pero el valor no es del tipo que la operación espera, entonces Luau convierte (coerce) el valor para cambiar su tipo de dato. La coerción ocurre en tiempo de ejecución para esa operación y no cambia el valor de una variable.
Aritmética
Luau coacciona cadenas a números en operaciones aritméticas. Este comportamiento está integrado en Luau. Si los tipos son incompatibles para la aritmética, Luau arroja un error y no ejecuta el resto del script. Por ejemplo, no puedes sumar una cadena a un número si la cadena no representa un número.
print(100 + "7") -- 107print(100 - "7") -- 93print("1000" + 234) -- 1234print("1000" - 234) -- 766print("hello" + 234) -- error: intento de realizar aritmética (suma) entre una cadena y un número
Concatenación
En la concatenación, Luau coacciona números a cadenas. Para convertir un número a una cadena sin usar coerción, usa la función string.format().
print("Pi es " .. math.pi) --> Pi es 3.1415926535898print("Pi es " .. 3.1415927) --> Pi es 3.1415927-- Redondea a tres decimalesprint("Pi es " .. string.format("%.3f", 3.1415927)) -- Pi es 3.142
Asignación
Algunas propiedades esperan ciertos tipos de datos, como un Enum o cadena, pero puedes asignar un valor de un tipo diferente y Luau convierte el valor al tipo que la propiedad espera.
Enums
Luau coacciona números y cadenas de valores enum al nombre completo del enum. Por ejemplo, puedes nombrar el valor de la propiedad Part.Material usando un número, una cadena o el nombre completo del enum, y la función print() siempre imprime el nombre completo del enum. Es una buena práctica ser explícito y usar el nombre completo del enum. Para más información sobre Enums, consulta Enums.
local Workspace = game:GetService("Workspace")local part1 = Instance.new("Part")part1.Material = 816part1.Parent = Workspaceprint(part1.Material) -- Enum.Material.Concretelocal part2 = Instance.new("Part")part2.Material = "Concrete"part2.Parent = Workspaceprint(part2.Material) -- Enum.Material.Concrete-- Esta es la mejor práctica porque es la más explícitalocal part3 = Instance.new("Part")part3.Material = Enum.Material.Concretepart3.Parent = Workspaceprint(part3.Material) -- Enum.Material.Concrete
Hora del día
La propiedad Lighting.TimeOfDay, que define si es de noche, de día o en cualquier otro momento, es una representación en cadena del tipo de dato DateTime. Si asignas un número a Lighting.TimeOfDay, Luau lo convierte a la representación en cadena de DateTime.
local Lighting = game:GetService("Lighting")Lighting.TimeOfDay = "05:00:00"print(Lighting.TimeOfDay) -- 05:00:00Lighting.TimeOfDay = 5print(Lighting.TimeOfDay) -- 05:00:00