★網站前端技術發展太快, 新手很難抉擇要學的東西, 大家學了什麼

CSS:https://colorlib.com/wp/free-css3-frameworks/
JS:https://colorlib.com/wp/javascript-frameworks/
HYBRID APP:https://blog.jscrambler.com/10-frameworks-for-mobile-hybrid-apps/
2d/3d Game:https://www.diycode.cc/topics/16
Desktop:https://electron.atom.io/
IOT:https://webduino.io/

上述只是冰山一角, UI/UX視覺整合, 前端資安, 後端node.js, Social Plugin, SEO, 自動化測試, 大數據分析, 資料視覺化, RWD, AI, Google Map, 語音辨識, 文字轉發音, 影像辨識, VR/AR, Webphone, WebRTC, midi, GrouthHacker, 程式混淆壓縮加密, 程式編譯如Typescript/Kotlin編譯成js, 版控只能git了,讓你玩不完....老實說有點噁心, 而且沒談到各框架生態系與外掛....哈哈 Orz

後端工作如後台開發, 金流, 後台資安, 大數據分析, 自動化測試, 排程, BOT, 轉檔, 檔案管理, RESTFUL API撰寫, 伺服器調教維運, 資料庫調教維運, LOG管理, 種類相較較少, 當然不是說比前端簡單, 後端工作需要深度學習與經驗. 個人推薦python作為後端開發程式會很省力, 因為投資報酬率還不錯. 或者想省掉後端管理的工就用firebase也是不錯選擇

2016年2月24日 星期三

Corona SDK Lua 程式語言基礎

全域變數不需要宣告,給一個變量賦值後即建立了這個全域變數,而全域變數未初始化得到的值是 nil

print(b) --> nil
b = 1
print(b) --> 1

如果你想删除一個全域變數,只需要將變數賦值 nil

b = nil

保留字

and break do else elseif
end false for function if
in local nil not or
repeat return then true until
while

變數是大小寫有區分,不要數字開頭
單行註解

--這是單行註解

多行註解

--[[
    這是多行註解
    這是多行註解
    這是多行註解
--]]

Lua 中有 6 個基本類型分別為:nil、boolean、number、string、function、table

print(type("Hello world")) --> string
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string
print({}) --> table

變數可隨時切換型態

print(type(a)) --> nil (未初始化)
a = 10
print(type(a)) --> number
a = "a string!!"
print(type(a)) --> string
a = print
a(type(a)) --> function

Booleans - false 和 nil 為假,其它值為真,所以 Lua 中的 0 與空字串都為真
Numbers - 數值呈現方式 4、0.4、4.57e-3、0.3e12、5e+20
Strings - 可用單引號與雙引號與多行字串[[...]]表示如 "test"、'test'、[[test]]
數值字串轉換

print("11"+1) --> 12 (number)
print("11"..1) --> 111 (string)
print(tonumber("11")) --> 11 (number)
print(tostring(11)) --> 11 (string)

Functions - 可做參數與函示返回值,在函示裡可以做動態生成的函示(安全運行環境的隐藏函数,如下)

function outside()
    function inside() print("inside called") end -- 動態生成隱藏函數
    inside() -- outside 函示外部環境不能呼叫 outside 函示內部 inside 函示,因此稱為安全環境
end

Tables -

days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
days[2] --> Monday
a = {x=0, y=0} --> 意同 a = {}; a.x=0; a.y=0 或 a = {["x"]=0, ["y"]=0}
a.x = nil --移除 a.x
--在構造函数中域分隔符逗号(",")可以用分號(";")替代,通常我們使用分號来分割不同類型的表元素。
local a = {x=10, y=45; "one", "two", "three"}

一元運算符:- (負值)
二元運算符:+ - * / ^ (次方)
關係運算符:< > <= >= == ~= (不等於)
邏輯運算符:and or not
a and b -- 如果 a 為 false,則返回 a ,否則返回 b
a or b -- 如果 a 為 true,則返回 a,否則返回 b
★如果為 false 或者 nil 則给 x 赋初始值 v:

x = x or v --意同 if not x then x = v end

and 的優先级比 or 高。
lua 模擬三元運算 (a and b) or c
not 的结果只返回 false 或者 true
優先级高低

^
not - (unary)
* /
+ -
..
< > <= >= ~= ==
and
or

優先级範例

a+i < b/2+1 --> (a+i) < ((b/2)+1)
5+x^2*8 --> 5+((x^2)*8)
a < y and y <= z --> (a < y) and (y <= z)
-x^2 --> -(x^2)
x^y^z --> x^(y^z)

多參數設定

a, b = 10, 2 --> a=10; b=2
x, y = y, x -- x, y 交換值
a[i], a[j] = a[j], a[i] -- 'a[i]', 'a[i]' 交換值

a, b, c = 0, 1
print(a,b,c) --> 0 1 nil
a, b = a+1, b+1, b+2 -- b+2 會被忽略
print(a,b) --> 1 2
a, b, c = 0
print(a,b,c) --> 0 nil nil
a, b = f() --> f return 兩個值如 function f() return 1,2 end

區域變數
使用local建立一個區域變數,與全域變數不同,區域變數只在被宣告的程式區塊內有效。
應該盡可能使用區域變數,有兩個好處:
1. 避免命名衝突
2. 訪問區域變數的速度比全域變數更快

x = 10
local i = 1
if i > 20 then
    local x -- 此 x 為區域變數,存活範圍 then - else 之間
    x = 20
    print(x + 2) --> 22
else
    print(x) --> 10 此 x 為全域變數
end

條件式

if conditions then
    then-part
end

if conditions then
    then-part
else
    else-part
end

if conditions then
    then-part
elseif conditions then
    elseif-part
..  --->多個 elseif
else
    else-part
end

while condition do
    statements
end

repeat
    statements
until conditions

for var=exp1,exp2,exp3 do
    loop-part
end

for 將用 exp3 作為 step 從 exp1(初始值)到 exp2(终止值),執行 loop-part。其中 exp3 可以省略,預設 step = 1。exp1, exp2, exp3 只會被計算一次,在循環前,且為區域變數

for i=10,1,-1 do -- exp3 為 -1 表示每次迴圈 i-1
    print(i)
end

跳出迴圈

for i=10,1,-1 do
    if i == 5 then break end
end

table 表鍵值輸出

-- print all values of array 'a' 印出 table 所有值
for i,v in ipairs(a) do print(v) end

-- print all keys of table 't' 印出 table 所有鍵
for k in pairs(t) do print(k) end 

當函數只有一個參數並且這個參數是字串或者表的时候,()可有可無

print "Hello World" --> print("Hello World")
dofile 'a.lua' --> dofile ('a.lua')
print [[a multi-line 
message]] --> print([[a multi-line
message]])
f{x=10, y=20} --> f({x=10, y=20})
type{} --> type({})

多返回值

s, e = string.find("hello Lua users", "Lua")
print(s, e) --> 7 9

function foo0 () end -- 沒返回
function foo1 () return 'a' end -- 返回1個值
function foo2 () return 'a','b' end -- 返回2個值

x,y = foo2() -- x='a', y='b'
x = foo2() -- x='a', 'b' 被忽略
x,y,z = 10,foo2() -- x=10, y='a', z='b'
x,y = foo0() -- x=nil, y=nil
x,y = foo1() -- x='a', y=nil
x,y,z = foo2() -- x='a', y='b', z=nil
x,y = foo2(), 20 -- x='a', y=20
x,y = foo0(), 20, 30 -- x='nil', y=20, 30 被忽略

print(foo0()) -->
print(foo1()) --> a
print(foo2()) --> a b
print(foo2(), 1) --> a 1
print(foo2() .. "x") --> ax

a = {foo0()} -- a = {} (空表格)
a = {foo1()} -- a = {'a'}
a = {foo2()} -- a = {'a', 'b'}
a = {foo0(), foo2(), 4} -- a[1] = nil, a[2] = 'a', a[3] = 4

用括號強制函數返回一個值

print((foo0())) --> nil
print((foo1())) --> a
print((foo2())) --> a

多參數函示
arg 為多餘參數且為 table

function g (a, b, ...) 
    print(a,b,arg)
end
g(3) --> a=3, b=nil, arg={n=0}
g(3, 4) --> a=3, b=4, arg={n=0}
g(3, 4, 5, 8) --> a=3, b=4, arg={5, 8; n=2}

如果我們只想要string.find返回的第二個值。一個典型的方法是使用啞元(dummy variable,底線)

local _, x = string.find(s, p)

函示宣告有兩種方式

function foo (x) return 2*x end
foo = function (x) return 2*x end

下面例子中包含在 sortbygrade 函式内部的 sort 中的匿名函数可以訪問 sortbygrade 的參數 grades,在匿名函式内部 grades 不是全域變數也不是區域變數,我們稱做為外部的區域變數( external local variable )或者 upvalue。

function sortbygrade (names, grades)
    table.sort(names, function (n1, n2)
        return grades[n1] > grades[n2] -- compare the grades
    end)
end

table 表中的函示宣告

Lib = {}
Lib.foo = function (x,y) return x + y end
Lib.goo = function (x,y) return x - y end

Lib = {
    foo = function (x,y) return x + y end,
    goo = function (x,y) return x - y end
}

Lib = {}
function Lib.foo (x,y)
    return x + y
end
function Lib.goo (x,y)
    return x - y
end

遞迴函示宣告
如下上面這種方式導致 Lua 編譯時遇到 fact(n-1) 並不知道它是區域變數 fact,Lua 會去查找是否有這樣的全局函示 fact。為了解决這個問題我們必須在定義函式以前先宣告 fact

local fact = function (n)
    if n == 0 then
        return 1
    else
        return n*fact(n-1) --> 編譯器會認為是全域函示
    end
end

--改寫
local fact
fact = function (n)
    if n == 0 then
        return 1
    else
        return n*fact(n-1)
    end
end

函式返回值可以是運算式

function myReturn()
    return x+y-z
end

_G 是 lua 的環境變數,大家可以 print_r(_G) 看看,只要你的main.lua裡有設置全域變數,都會出現在_G全域表裡。或許可以找到官方未公開的函示:)
了解 Lua 程式基礎後可以進入 Corona SDK 精選 API 快速入門 階段

沒有留言:

張貼留言