zoukankan      html  css  js  c++  java
  • lua笔记

    print("hello world")
    
    local function fact(n)
    	if n == 0 then
    		return 1
    	else
    		return n * fact(n-1)
    	end
    end
    
    local a = fact(5)
    print(a)
    
    print(b)
    
    --。Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table
    print(type("hello world"))
    print(type(4.6))
    print(type(print))
    print(type(type))
    print(type(true))
    print(type(nil))
    print(type(type(x)))
    
    testTable = {}
    testTable = nil
    
    function testNil()
    	if  testTable == nil then
    		print("nil is false")
    	else
    		print("nil is not false")
    	end
    end
    testNil()
    
    --[[这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,
    Lua认为两者不同;nil只和自己相等。Lua通过引用比较tables、userdata、functions。
    也就是说当且仅当两者表示同一个对象时相等。]]
    a = {}; a.x = 1; a.y = 0;
    b = {}; b.x = 1; b.y = 0;
    c = a;
    function testEqual()
    	if a == b then
    		print("a == b")
    	elseif c == a then
    		print("a == c")
    	end
    end
    testEqual()
    
    --[[逻辑运算符认为false和nil是假(false),其他为真,0也是true. 
    and和or的运算结果不是true和false,而是和它的两个操作数相关]]
    print(4 and 5)
    print(4 and false)
    print(false and nil)
    print(false or nil)
    print(true or true)
    x = x or 10
    print(x)
    
    --三元运算符,前提条件是b不为假
    a = 1; b = true; c = 2;
    print((a and b) or c)
    
    --not的结果一直返回false或者true 
    print(not false)
    
    --..字符串连接,如果操作数为数字,Lua将数字转成字符串。
    print("hello" .. " world")
    print(1 .. 2)
    
    --对于table usedata,function,lua是作引用比较的;nil只与他自身相等
    a = {}
    a.x = 1; a.y = 2
    b = {}
    b.x = 1; b.y = 2
    c = a
    print(a == b)
    print(a ~= b)
    print(a == c)
    
    --表的构造
    local days = {"sun", "mon", "tue", "wed", "thu", "fri", "sat"}
    print(days[1])
    local vec = {x = 1, y = 2, "sun"}
    print(vec[1])
    print(vec["x"])
    print(vec.y)
    
    --表索引
    local a = {["x"]=3, ["y"]=4}
    a["z"] = 5
    a.w = 6
    print(a.x)
    print(a["y"])
    print(a.z)
    print(a.w)
    
    --list风格初始化和record风格初始化是这种一般初始化的特例: 
    --{x=0, y=0} <--> {["x"]=0, ["y"]=0} 
    --{"red", "green", "blue"} <--> {[1]="red", [2]="green", [3]="blue"} 
    
    --链表
    local single_list = nil
    local function make_list(begin, count)
    	for i = 1, count, 1 do
    		single_list = {value = begin, next = single_list}
    		begin = begin + 1
    	end
    end
    make_list(1, 10)
    
    local function print_list()
    	local temp_list = single_list;
    	while temp_list ~= nil do
    		print("list value:" .. temp_list.value)
    		temp_list = temp_list.next;
    	end
    end
    print_list()
    
    function test_do()
    	--Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。
    	--a, b = 10, 2*x   <-->   a=10; b=2*x
    
    	--遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值
    	do
    		x, y = y, x
    	end
    
    	--if
    	do
    		if true then
    		
    		elseif false then
    		
    		else
    		
    		end
    	end
    
    	--while
    	do
    		while true do
    
    		end
    	end
    
    	--for
    	do
    		for i = 1, 10, 1 do
    			print(i)
    		end
    	end
    end
    
    --泛型for
    function foreach()
    	local list = {"2", "3", "4"}
    	for i,v in ipairs(list) do
    		print("value:" .. v)
    	end
    	
    	for i in pairs(list) do
    		print("kay:" .. i)
    	end
    end
    foreach()
    
    --Lua语法要求break和return只能出现在block的结尾一句(也就是说:作为chunk的最后一句,或者在end之前,或者else前,或者until前)
    --[[
    function foo () 
    	return  --<< SYNTAX ERROR 
    	-- 'return' is the last statement in the next block 
    	do return end -- OK 
    	...   -- statements not reached 
    end ]]
    
    --可变参数:Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(...)表示函数有可变的参数。Lua将函数的参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数。
    function pair_fun(a, b, ...)
    	for i, v in ipairs(arg) do
    		print("arg:" .. i .. " " .. v)
    	end
    end
    pair_fun(1,2,3)
    pair_fun(1,2,3, 4)
    pair_fun(1,2)
    
    print(math.sin(1))
    --闭包
    function package()
    	local old_sin = math.sin
    	local k = math.pi/180
    	math.sin = function(x)
    		return old_sin(x*k)
    	end
    end
    package()
    print(math.sin(1))
    
    
    --非全局函数
    lib = {}
    lib.foo = 
    function(x, y) 
    	return x+ y 
    end
    print(lib.foo(1,1))
    
    function lib.goo(x , y)--另一种语法方式
    	return x - y
    end
    print(lib.goo(1,2))
    
    --函数定义的两种方式
    local f = function()
    
    end
    function f()
    
    end
    
    
    --闭包函数调用
    function list_iter(t)
    	local i = 0
    	local n = table.getn(t)
    	return function()
    		i = i + 1
    		if i <= n then
    			return t[i]
    		end
    	end
    end
    function use_iter()
    	local t = {10,20,30}
    	iter = list_iter(t)
    	while true do
    		local element = iter()
    		if element == nil then
    			break
    		end
    		print(element)
    	end
    end
    use_iter()
    
    --loadstring
    local f = loadstring("local a = 1; return a + 2")
    print(f())
    
    --assert
    assert(true)
    
    --error
    local function foo()
    	--if false then
    		error()
    		debug.traceback()
    	--end
    end
    function process_call()
    	foo()
    end
    --process_call()
    
    
    --多维数组
    mt = {}
    function create_mt()
    	for i = 1, 10 do
    		mt[i] = {}
    		for j = 1, 10 do
    			mt[i][j] = i * j
    		end
    	end
    end
    function print_mt()
    	for i = 1, table.getn(mt) do
    		for j, v in ipairs(mt[i]) do
    			print(i, j, v)
    		end
    	end
    end
    create_mt()
    print_mt()
    
    --可变参数
    function add(...)
    	local s = 0
    	for i, v in ipairs{...} do
    		s = s + v
    	end
    	return s
    end
    print(add(1,2,3))
    
    --元表
    my_meta=
    {
    	__add=function(op1, op2)
    		op = {}
    		op.x = op1.x + op2.x;
    		op.y = op1.y + op2.y;
    		return op
    	end
    }
    a={x=1, y=2}
    setmetatable(a,my_meta)
    b={x=3,y=4}
    c=a+b
    print(c.x,c.y)--输出4,6
    

      

  • 相关阅读:
    django缓存,信号,orm性能,多数据库配置
    git实战
    Web框架
    Windows Server 2012 R2 管理员密码忘记如何修改密码
    主机记录和记录值
    Python的类
    GenomicRangeQuery Find the minimal nucleotide from a range of sequence DNA.
    Countdiv-Codility Lesson5
    Windows域控时间不正确,设置互联网NTP服务器时间自动同步
    Missing Smallest positive integer
  • 原文地址:https://www.cnblogs.com/lancidie/p/4971160.html
Copyright © 2011-2022 走看看