`
zuroc
  • 浏览: 1309822 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

Programming in Lua 读书摘抄

    博客分类:
  • C++
阅读更多

据某某C++的叛徒说"感觉很多地方 lua 都是鄙视 python 的低效"

囧,python的确很慢.是个脚本都喜欢BS它.

lua虽然也很变态,但好歹没有erlang变态

目前还没有看到类似python中dir , help这种好用的函数.还有就是print虽然有语法糖,但是不够甜

不过因为很小,感觉比python清爽不少,很容易就整合到自己的C++程序中间去了.

感觉用给python写扩展是一件很不爽的事情,也难怪那个自称"世界最強絶対無敵電光石火疾風迅雷資料基盤管理器"的Tokyo Cabinet,有 Perl的官方API,有Ruby的官方API,有Java的官方API,有Lua的官方API,就是没有python的官方Api

lua用来写网络也颇有感觉.

以下是 Programming in Lua 读书摘抄,网上有完美的中文pdf,可以找着去下载


1.

lua的不等于 ~=

2.

Lua 语法要求 break 和 return 只能出现在 block 的结尾一句(也就是说:作为 chunk 的最后一句,或者在 end 之前,或者 else前,或者 until前) ,例如:

local i = 1
while a[i] do
  if a[i] == v then break end
  i = i + 1
end

有时候为了调试或者其他目的需要在 block的中间使用 return或者break,可以显式的使用 do..end 来实现:

function foo ()
  return       --<< SYNTAX ERROR
  -- 'return' is the last statement in the next block
  do return end     -- OK
  ...         -- statements not reached
end

3.
Lua函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足。
function f(a, b) return a or b end

CALL        PARAMETERS

f(3)        a=3, b=nil
f(3, 4)      a=3, b=4
f(3, 4, 5)     a=3, b=4  (5 is discarded)

4.

function foo0 () end           -- returns no results
function foo1 () return 'a' end     -- returns 1 result
function foo2 () return 'a','b' end  -- returns 2 results
第一,当作为表达式调用函数时,有以下几种情况:
1.  当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能
多地返回多个值,不足补 nil,超出舍去。
2.  其他情况下,函数调用仅返回第一个值(如果没有返回值为 nil)
x,y = foo2()        -- x='a', y='b'
x = foo2()         -- x='a', 'b' is discarded
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 is discarded

5.

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

6.
模块内部私有函数
local f = function (...)
  ...
end

7.
for与迭代器

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

t = {10, 20, 30}
for element in list_iter(t) do
  print(element)
end

8.
无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。

function iter (a, i)
  i = i + 1
  local v = a[i]
  if v then
    return i, v
  end
end

function ipairs (a)
  return iter, a, 0
end

a = {"one", "two", "three"}
for i, v in ipairs(a) do
  print(i, v)
end

当 Lua 调用 ipairs(a)开始循环时,他获取三个值:迭代函数 iter、状态常量 a、控制变量初始值 0;
然后 Lua调用 iter(a,0)返回1,a[1] (除非 a[1]=nil);第二次迭代调用 iter(a,1) 返回 2,a[2]……直到第一个非 nil元素。

9.
协同 : 用途 类似生产者 消费者

co = coroutine.create(function ()
  print("张沈")
  coroutine.yield()
  print("鹏")
end)

print(co)    --> thread: 0x8071d98
协同有三个状态:
    挂起态(suspended)、运行态(running)、停止态(dead)。
   
当我

创建协同程序成功时,其为挂起态,即此时协同程序并未运行。

我们可用 status 函数检查协同的状态:
print(coroutine.status(co))   --> suspended
函数 coroutine.resume使协同程序由挂起状态变为运行态:
coroutine.resume(co)       --> 张沈
coroutine.resume(co)       --> 鹏
任务完成,便进入终止态:
print(coroutine.status(co))   --> dead


协同传入参数

co = coroutine.create(function (a,b,c)
  print("co", a,b,c)
end)
coroutine.resume(co, 1, 2, 3)    --> co  1  2  3

yeild返回参数

co = coroutine.create(function (a,b,c)
  print("co", a,b,c)
end)
coroutine.resume(co, 1, 2, 3)    --> co  1  2  3

yeild获取参数

co = coroutine.create (function ()
  print("co", coroutine.yield())
end)
coroutine.resume(co)
coroutine.resume(co, 4, 5)    --> co  4  5

用来写迭代器

function perm (a)
  local n = table.getn(a)
  return coroutine.wrap(function () permgen(a, n) end)
end

等价于

function perm (a)
  local n = table.getn(a)
  local co = coroutine.create(function () permgen(a, n)  end)
  return function ()  -- iterator
    local code, res = coroutine.resume(co)
    return res
  end
end

10.
阻塞网络
相关文档 http://www.tecgraf.puc-rio.br/~diego/professional/luasocket/tcp.html

require "socket"

function receive (connection)
  return connection:receive(2^10)
end

function download (host, file)
  local c = assert(socket.connect(host, 80))
  local count = 0    -- counts number of bytes read
  c:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
  while true do
    local s, status = receive(c)
    if status == "closed" then break end
    count = count + string.len(s)
  end
  c:close()
  print(file, count)
end

download("www.baidu.com" , "/" )
分享到:
评论

相关推荐

    Programming in Lua Fourth edition

    《Programming in Lua Fourth Edition》是关于Lua编程语言的一本权威指南,由Luiz Henrique de Figueiredo、Ricardo Tomasi和Tiago Fonseca共同撰写。这本书详细介绍了Lua语言的核心概念、语法和特性,是学习和精通...

    Programming in Lua(中文版).pdf

    《Programming in Lua》是一本专为学习和精通Lua编程语言而编写的权威指南。这本书的中文版提供了对Lua语言深入且全面的解析,适合初学者和有经验的程序员使用。Lua是一种轻量级、高性能、易扩展的脚本语言,广泛...

    Programming in Lua(4th) 无水印pdf

    Programming in Lua(4th) 英文无水印pdf 第4版 pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传...

    Programming in Lua 4th Edition 高清版 带完整书签

    《Programming in Lua 4th Edition》是一本专为学习和精通Lua编程语言而编写的权威指南。这本书由 Lua 的主要开发者之一,Pedro Melo 执笔,旨在深入浅出地介绍Lua语言的核心概念、语法和应用。第四版是该系列的最新...

    Programming in Lua, 3rd.pdf

    Programming in Lua, 3rd.pdfProgramming in Lua, 3rd.pdfProgramming in Lua, 3rd.pdfProgramming in Lua, 3rd.pdf

    Programming In Lua 中文版PDF高清

    ### Programming In Lua 知识点概览 #### 第一篇 语言 **第0章 序言** - **简述**:介绍了《Programming in Lua》这本书的目的、适用对象以及为何选择Lua作为学习对象等内容。 - **知识点**:了解Lua语言的特点...

    Programming in Lua(2nd Edition)

    《Programming in Lua》第二版是一本介绍Lua编程语言的经典著作,由Roberto Ierusalimschy撰写,是深入了解和学习Lua语言的宝贵资源。Lua是一种轻量级的、高效、易于嵌入的脚本语言,广泛应用于游戏、移动应用、网络...

    programming in lua_lua_

    《Programming in Lua》是关于Lua编程语言的一本权威书籍,由巴西计算机科学家Pietro Trovato撰写。这本书深入浅出地介绍了Lua语言的核心概念、语法特性以及在实际开发中的应用。Lua是一种轻量级、高效且可扩展的...

    LUA编程programminginlua.rar

    "Programming in Lua"是一本广泛认可的LUA编程教程,由Pierre Giraud编写,深入浅出地介绍了LUA语言的核心概念和技术。这个压缩包"LUA编程programminginlua.rar"包含了学习LUA编程的重要资源。 打开"Programming in...

    Programming in Lua Second Edition

    《Programming in Lua Second Edition》是关于Lua编程语言的一本经典著作,主要针对的是Lua 5.1版本。这本书深入浅出地介绍了Lua语言的核心概念、语法特性以及在实际开发中的应用,是学习和掌握Lua语言的重要参考...

    Programming in Lua 3rd(mobi)

    不多说,学习Lua必备,Roberto Ierusalimschy大作,英文版,mobi格式,供kindle人学习使用。

    ProgramminginLua中文版

    ProgramminginLua中文版 介绍Lua语法 适用于wow插件开发

    LUA编程(programming in lua)

    LUA编程(programming in lua) 第一版 文字版

Global site tag (gtag.js) - Google Analytics