您的位置:首页 > 编程语言 > Lua

15分钟lua 练习

2015-10-08 11:24 537 查看
原文:http://blog.jobbole.com/70480/

--[[--变量 & 控制流

local num = 1
while num < 5 do
num = num + 1
print (num)
end

function show()
if num < 5 then
print (num)
elseif num == 5 then
io.write('num is 5\n')
else
local  line = io.read()
print('how to be a great people?  ' .. line)
end

end

show()

foo = anUnknownVariable

if foo == nil then
io.write('foo is nil\n')

end

aBoolValue = false

if 0 then print('false\n')end

ans = aBoolValue and 'yes' or 'no'

print(ans)

karlSum = 0

for i= 1,5 do
karlSum = karlSum + 1
print(karlSum)

end

for j=10,1,-2 do print(j) end

num = 3

repeat
print('凡人必有一死')
num = num -1
until num == 0

--]]

--[[--函数

function fib(n)
if n < 2 then return 1 end
return fib(n - 2) + fib(n-1)

end

fib3 = fib(3)

print(fib3)

function adder(x)

    -- 返回一个函数

    -- 闭包内封存 x 值

    return function (y) return x + y end

end

a1 = adder(9)

a2 = adder(36)

print(a1(16))  --> 25

print(a2(64))  --> 100

x, y, z = 1, 2, 3, 4 --4将被忽略

function  bar(a, b, c)
print(a, b, c)
return 4, 8, 15, 16, 23, 42

end

x, y = bar('zaphod')

print(x) print(y)

--function f(x) return x * x end

f = function (x) return x * x end

print(f(5))

print 'Hello World!'

--]]

--[[Metatables & metamethods

--表

t = {key1 = 'value1', key2 = false}

-- 像 Javascript 一样以 . 取值

print(t.key1)

t.key3 = {}

t.key2 = nil

print(t.key2)

print(t.key3)

u = {['@!#'] = 'qbert', [{}] = 1729, [6.28] = 'tau'}

print(u[6.28])

a = u['@!#'] print (a)

b = u[{}] print(b)

function  h( x )
print(x.key1)

end

c = h{key1 = 'sonmi'}

for key, val in pairs(u) do  -- 像 Python  一样的键值迭代

    print(key, val)

end

 

print(_G['_G'] == _G)

v = {'value1', 'value2', 1.21, 'gigawatts'}

for i = 1, #v do --像Base一样,#v 表示列表长度
print(v[i])

end

f1 = {a = 1, b = 2}

f2 = {a = 2, b = 3}

mm = {}

function  mm.__add( x,y )

sum = {}
sum.a = x.a + y.a print(sum.a)
sum.b = x.b + y.b print(sum.b)
return sum

end

setmetatable(f1, mm)

setmetatable(f2, mm)

s = f1 + f2

-- __index 元方法重载表中 key 的提取符号 `.`

defaultFavs = {animal = 'gru', food = 'donuts'}

--myFavs = {food = 'pizza'}

myFavs={}

setmetatable(myFavs, {__index = defaultFavs})

food = myFavs.food

print(food)

  

-- 像 Javascript 一样并没有内置 Class

-- 但可以通过 Table `{}` 实现

 

Dog = {}                                -- 1.

function Dog:new()                      -- 2.

    newObj = {sound = 'woof'}           -- 3.

    self.__index = self                 -- 4.

    return setmetatable(newObj, self)   -- 5.

end

function Dog:makeSound()                -- 6.

    print('I say ' .. self.sound)

end

 

mrDog = Dog:new()                       -- 7.

mrDog:makeSound() --> "I say woof"

 

-- 1. Dog 像类但实际是 Table

-- 2. Dog:new(...) := Dog.new(self, ...)

-- 3. newObj 作 Dog 的实例

-- 4. self 是 Lua 中默认的参数,在这里 self = Dog

--    继承的时候可以改变

--    self.__index 与 self 的元方法 __index 不是一回事

--    self = {__index = self, metatable = {__index = ...}}

-- 5. setmetatable(newObj, self) 相当于 setmetatable(newObj, {__index = self})

--    赋予实例所有类方法

-- 6. 同 2.

-- 7. mrDog = Dog.new(Dog)

 

-- 继承

LoudDog = Dog:new()

function LoudDog:makeSound()

    s = self.sound .. ' '

    print(s .. s .. s)

end

seymour = LoudDog:new()

LoudDog:makeSound() --> "woof woof woof"

--]]

--[[

local mod1 = require('mod')

local mod = (function()

local M = {}

 

local function sayMyName()

    print('Hrunkner')

end

 

function M.sayHello()

    print('Why hello there')

    sayMyName()

end

return M
end)()

mod.sayHello() --> "Why hello there"

--local a = require("mod2") --> "mod2"

--local b = require("mod2") -- 不输出, 实际为 b = a

--dofile("C:/Users/Administrator/Documents/Visual Studio 2015/Projects/lua/Debug/mod2.lua") --> "mod2"

--dofile("C:/Users/Administrator/Documents/Visual Studio 2015/Projects/lua/Debug/mod2.lua") --> "mod2"

f = loadfile("C:/Users/Administrator/Documents/Visual Studio 2015/Projects/lua/Debug/mod2.lua")

f() --> "mod2"

]]

f = load("print('test')")();

f()  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: