Created
January 25, 2018 04:11
-
-
Save nilesh-tawari/02078ae5b83ce3c90f476c4858c60693 to your computer and use it in GitHub Desktop.
LUA cheatSheet
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- [[ Cheatsheet for LUA from http://www.newthinktank.com/2015/06/learn-lua-one-video/]] | |
-- Prints to the screen (Can end with semicolon) | |
print("Hello World") | |
--[[ | |
Multiline comment | |
]] | |
-- Variable names can't start with a number, but can contain letters, numbers | |
-- and underscores | |
-- Lua is dynamically typed based off of the data stored there | |
-- This is a string and it can be surrounded by ' or " | |
name = "Derek" | |
-- Another way to print to the screen | |
-- Escape Sequences : \n \b \t \\ \" \' | |
-- Get the string size by proceeding it with a # | |
io.write("Size of string ", #name, "\n") | |
-- You can store any data type in a variable even after initialization | |
name = 4 | |
io.write("My name is ", name, "\n") | |
-- Lua only has floating point numbers and this is the max number | |
bigNum = 9223372036854775807 + 1 | |
io.write("Big Number ", bigNum, "\n") | |
io.write("Big Number ", type(bigNum), "\n") | |
-- Floats are precise up to 13 digits | |
floatPrecision = 1.999999999999 + 0.0000000000005 | |
io.write(floatPrecision, "\n") | |
-- We can create long strings and maintain white space | |
longString = [[ | |
I am a very very long | |
string that goes on for | |
ever]] | |
io.write(longString, "\n") | |
-- Combine Strings with .. | |
longString = longString .. name | |
io.write(longString, "\n") | |
-- Booleans store with true or false | |
isAbleToDrive = true | |
io.write(type(isAbleToDrive), "\n") | |
-- Every variable gets the value of nil by default meaning it has no value | |
io.write(type(madeUpVar), "\n") | |
-- ---------- MATH ---------- | |
io.write("5 + 3 = ", 5+3, "\n") | |
io.write("5 - 3 = ", 5-3, "\n") | |
io.write("5 * 3 = ", 5*3, "\n") | |
io.write("5 / 3 = ", 5/3, "\n") | |
io.write("5.2 % 3 = ", 5%3, "\n") | |
-- Shorthand like number++ and number += 1 aren't in Lua | |
-- Math Functions: floor, ceil, max, min, sin, cos, tan, | |
-- asin, acos, exp, log, log10, pow, sqrt, random, randomseed | |
io.write("floor(2.345) : ", math.floor(2.345), "\n") | |
io.write("ceil(2.345) : ", math.ceil(2.345), "\n") | |
io.write("max(2, 3) : ", math.max(2, 3), "\n") | |
io.write("min(2, 3) : ", math.min(2, 3), "\n") | |
io.write("pow(8, 2) : ", math.pow(8, 2), "\n") | |
io.write("sqrt(64) : ", math.sqrt(64), "\n") | |
-- Generate random number between 0 and 1 | |
io.write("math.random() : ", math.random(), "\n") | |
-- Generate random number between 1 and 10 | |
io.write("math.random(10) : ", math.random(10), "\n") | |
-- Generate random number between 1 and 100 | |
io.write("math.random(1,100) : ", math.random(1,100), "\n") | |
-- Used to set a seed value for random | |
math.randomseed(os.time()) | |
-- Print float to 10 decimals | |
print(string.format("Pi = %.10f", math.pi)) | |
-- ---------- CONDITIONALS ---------- | |
-- Relational Operators : > < >= <= == ~= | |
-- Logical Operators : and or not | |
age = 13 | |
if age < 16 then | |
io.write("You can go to school", "\n") | |
local localVar = 10 | |
elseif (age >= 16) and (age < 18) then | |
io.write("You can drive", "\n") | |
else | |
io.write("You can vote", "\n") | |
end | |
-- A variable marked local is local only to this if statement | |
-- io.write("Local Variable : ", localvar) | |
if (age < 14) or (age > 67) then io.write("You shouldn't work\n") end | |
-- Format, convert to string and place boolean value with string.format | |
print(string.format("not true = %s", tostring(not true))) | |
-- There is no ternary operator in Lua | |
-- canVote = age > 18 ? true : false | |
-- This is similar to the ternary operator | |
canVote = age > 18 and true or false | |
io.write("Can I Vote : ", tostring(canVote), "\n") | |
-- There is no Switch statement in Lua | |
-- ---------- STRINGS ---------- | |
quote = "I changed my password everywhere to 'incorrect.' That way when I forget it,it always reminds me, 'Your password is incorrect.'" | |
io.write("Quote Length : ", string.len(quote), "\n") | |
-- Return the string after replacing | |
io.write("Replace I with me : ", string.gsub(quote, "I", "me"), "\n") | |
-- Find the index of a matching String | |
io.write("Index of password : ", string.find(quote, "password"), "\n") | |
-- Set characters to upper and lowercase | |
io.write("Quote Upper : ", string.upper(quote), "\n") | |
io.write("Quote Lower : ", string.lower(quote), "\n") | |
-- ---------- LOOPING ---------- | |
i = 1 | |
while (i <= 10) do | |
io.write(i) | |
i = i + 1 | |
-- break throws you out of a loop | |
-- continue doesn't exist with Lua | |
if i == 8 then break end | |
end | |
print("\n") | |
-- Repeat will cycle through the loop at least once | |
repeat | |
io.write("Enter your guess : ") | |
-- Gets input from the user | |
guess = io.read() | |
-- Either surround the number with quotes, or convert the string into | |
-- a number | |
until tonumber(guess) == 15 | |
-- Value to start with, value to stop at, increment each loop | |
for i = 1, 10, 1 do | |
io.write(i) | |
end | |
print() | |
-- Create a table which is a list of items like an array | |
months = {"January", "February", "March", "April", "May", | |
"June", "July", "August", "September", "October", "November", | |
"December"} | |
-- Cycle through table where k is the key and v the value of each item | |
for k, v in pairs(months) do | |
io.write(v, " ") | |
end | |
print() | |
-- ---------- TABLES ---------- | |
-- Tables take the place of arrays, dictionaries, tuples, etc. | |
-- Create a Table | |
aTable = {} | |
-- Add values to a table | |
for i = 1, 10 do | |
aTable[i] = i | |
end | |
-- Access value by index | |
io.write("First Item : ", aTable[1], "\n") | |
-- Items in Table | |
io.write("Number of Items : ", #aTable, "\n") | |
-- Insert in table, at index, item to insert | |
table.insert(aTable, 1, 0) | |
-- Combine a table as a String and seperate with provided seperator | |
print(table.concat(aTable, ", ")) | |
-- Remove item at index | |
table.remove(aTable, 1) | |
print(table.concat(aTable, ", ")) | |
-- Sort items in reverse | |
table.sort(aTable, function(a,b) return a>b end) | |
print(table.concat(aTable, ", ")) | |
-- Create a multidimensional Table | |
aMultiTable = {} | |
for i = 0, 9 do | |
aMultiTable[i] = {} | |
for j = 0, 9 do | |
aMultiTable[i][j] = tostring(i) .. tostring(j) | |
end | |
end | |
-- Access value in cell | |
io.write("Table[0][0] : ", aMultiTable[1][2], "\n") | |
-- Cycle through and print a multidimensional Table | |
for i = 0, 9 do | |
for j = 0, 9 do | |
io.write(aMultiTable[i][j], " : ") | |
end | |
print() | |
end | |
-- ---------- FUNCTIONS ---------- | |
function getSum(num1, num2) | |
return num1 + num2 | |
end | |
print(string.format("5 + 2 = %d", getSum(5,2))) | |
function splitStr(theString) | |
stringTable = {} | |
local i = 1 | |
-- Cycle through the String and store anything except for spaces | |
-- in the table | |
for str in string.gmatch(theString, "[^%s]+") do | |
stringTable[i] = str | |
i = i + 1 | |
end | |
-- Return multiple values | |
return stringTable, i | |
end | |
-- Receive multiple values | |
splitStrTable, numOfStr = splitStr("The Turtle") | |
for j = 1, numOfStr do | |
print(string.format("%d : %s", j, splitStrTable[j])) | |
end | |
-- Variadic Function recieve unknown number of parameters | |
function getSumMore(...) | |
local sum = 0 | |
for k, v in pairs{...} do | |
sum = sum + v | |
end | |
return sum | |
end | |
io.write("Sum : ", getSumMore(1,2,3,4,5,6), "\n") | |
-- A function is a variable in that we can store them under many variable | |
-- names as well as in tables and we can pass and return them though functions | |
-- Saving an anonymous function to a variable | |
doubleIt = function(x) return x * 2 end | |
print(doubleIt(4)) | |
-- A Closure is a function that can access local variables of an enclosing | |
-- function | |
function outerFunc() | |
local i = 0 | |
return function() | |
i = i + 1 | |
return i | |
end | |
end | |
-- When you include an inner function in a function that inner function | |
-- will remember changes made on variables in the inner function | |
getI = outerFunc() | |
print(getI()) | |
print(getI()) | |
-- ---------- COROUTINES ---------- | |
-- Coroutines are like threads except that they can't run in parallel | |
-- A coroutine has the status of running, susepnded, dead or normal | |
-- Use create to create one that performs some action | |
co = coroutine.create(function() | |
for i = 1, 10, 1 do | |
print(i) | |
print(coroutine.status(co)) | |
if i == 5 then coroutine.yield() end | |
end end) | |
-- They start off with the status suspended | |
print(coroutine.status(co)) | |
-- Call for it to run with resume during which the status changes to running | |
coroutine.resume(co) | |
-- After execution it has the status of dead | |
print(coroutine.status(co)) | |
co2 = coroutine.create(function() | |
for i = 101, 110, 1 do | |
print(i) | |
end end) | |
coroutine.resume(co2) | |
coroutine.resume(co) | |
-- ---------- FILE I/O ---------- | |
-- Different ways to work with files | |
-- r: Read only (default) | |
-- w: Overwrite or create a new file | |
-- a: Append or create a new file | |
-- r+: Read & write existing file | |
-- w+: Overwrite read or create a file | |
-- a+: Append read or create file | |
-- Create new file for reading and writing | |
file = io.open("test.lua", "w+") | |
-- Write text to the file | |
file:write("Random string of text\n") | |
file:write("Some more text\n") | |
-- Move back to the beginning of the file | |
file:seek("set", 0) | |
-- Read from the file | |
print(file:read("*a")) | |
-- Close the file | |
file:close() | |
-- Open file for appending and reading | |
file = io.open("test.lua", "a+") | |
file:write("Even more text\n") | |
file:seek("set", 0) | |
print(file:read("*a")) | |
file:close() | |
-- ---------- MODULES ---------- | |
-- A Module is like a library full of functions and variables | |
-- Use require to gain access to the functions in the module | |
convertModule = require("convert") | |
-- Execute the function in the module | |
print(string.format("%.3f cm", convertModule.ftToCm(12))) | |
-- ---------- METATABLES ---------- | |
-- Used to define how operations on tables should be carried out in regards | |
-- to adding, subtracting, multiplying, dividing, concatenating, or | |
-- comparing tables | |
-- Create a table and put default values in it | |
aTable = {} | |
for x = 1, 10 do | |
aTable[x] = x | |
end | |
mt = { | |
-- Define how table values should be added | |
-- You can also define _sub, _mul, _div, _mod, _concat (..) | |
__add = function (table1, table2) | |
sumTable = {} | |
for y = 1, #table1 do | |
if (table1[y] ~= nil) and (table2[y] ~= nil) then | |
sumTable[y] = table1[y] + table2[y] | |
else | |
sumTable[y] = 0 | |
end | |
end | |
return sumTable | |
end, | |
-- Define how table values should be checked for equality | |
__eq = function (table1, table2) | |
return table1.value == table2.value | |
end, | |
-- For homework figure out how to check if less then | |
__lt = function (table1, table2) | |
return table1.value < table2.value | |
end, | |
-- For homework figure out how to check if less then or equal | |
__le = function (table1, table2) | |
return table1.value <= table2.value | |
end, | |
} | |
-- Attach the metamethods to this table | |
setmetatable(aTable, mt) | |
-- Check if tables are equal | |
print(aTable == aTable) | |
addTable = {} | |
-- Add values in tables | |
addTable = aTable + aTable | |
-- print the results of the addition | |
for z = 1, #addTable do | |
print(addTable[z]) | |
end | |
-- ---------- OBJECT ORIENTED PROGRAMMING ---------- | |
-- Lua is not an OOP language and it doesn't allow you to define classes | |
-- but you can fake it using tables and metatables | |
-- Define the defaults for our table | |
Animal = {height = 0, weight = 0, name = "No Name", sound = "No Sound"} | |
-- Used to initialize Animal objects | |
function Animal:new (height, weight, name, sound) | |
setmetatable({}, Animal) | |
-- Self is a reference to values for this Animal | |
self.height = height | |
self.weight = weight | |
self.name = name | |
self.sound = sound | |
return self | |
end | |
-- Outputs a string that describes the Animal | |
function Animal:toString() | |
animalStr = string.format("%s weighs %.1f lbs, is %.1f in tall and says %s", self.name, self.weight, self.height, self.sound) | |
return animalStr | |
end | |
-- Create an Animal | |
spot = Animal:new(10, 15, "Spot", "Roof") | |
-- Get variable values | |
print(spot.weight) | |
-- Call a function in Animal | |
print(spot:toString()) | |
-- ---------- INHERITANCE ---------- | |
-- Extends the properties and functions in another object | |
Cat = Animal:new() | |
function Cat:new (height, weight, name, sound, favFood) | |
setmetatable({}, Cat) | |
-- Self is a reference to values for this Animal | |
self.height = height | |
self.weight = weight | |
self.name = name | |
self.sound = sound | |
self.favFood = favFood | |
return self | |
end | |
-- Overide an Animal function | |
function Cat:toString() | |
catStr = string.format("%s weighs %.1f lbs, is %.1f in tall, says %s and loves %s", self.name, self.weight, self.height, self.sound, self.favFood) | |
return catStr | |
end | |
-- Create a Cat | |
fluffy = Cat:new(10, 15, "Fluffy", "Meow", "Tuna") | |
print(fluffy:toString()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The
Animal:new
implementation is wrong, the function should return the new table (not self). See: https://devhints.io/lua