乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Lua常見問題回答 Lua FAQ non

       看見就非常 2012-09-17

      1,學(xué)習(xí)lua需要什么基礎(chǔ)?

      很顯然,lua不適合作為你第一個(gè)編程語(yǔ)言,因?yàn)樗枰容^深的c語(yǔ)言編程基礎(chǔ),而且對(duì)于數(shù)據(jù)結(jié)構(gòu)有一定的了解,最關(guān)鍵的是它的功能函數(shù)并不完整,需要很多額外第三方支持,比如最基本的socket。所以學(xué)習(xí)lua最好有c或者c++的基礎(chǔ)。

      2,學(xué)習(xí)lua應(yīng)該看什么文檔?

      最好從Programming In Lua (簡(jiǎn)稱PIL)中文版看起,非常有幫助,最好是逐字逐句的看。文檔在這里可以下載:http://groups.google.com/group/lua5 或者 http:///?p=1512

      在Lua for windows這個(gè)整合安裝包中包含了PIL和Lua manual這兩個(gè)文檔的英文版。

      3,如何在windows下使用lua?

      可以在Luaforge上找到編譯好的Lua lib/dll/exe。

      windows下最好是使用Lua for windows http:///projects/luaforwindows/,里面會(huì)包含一些常用的模塊,比如luasocket,luasql,sqlite等。而且還包含了一個(gè)編輯器Scite,可以通過它來對(duì)lua腳本進(jìn)行簡(jiǎn)單的調(diào)試,不需要額外安裝什么IDE了。

      如果你要自己編譯Lua,可以在下載Lua的源代碼,解壓以后,參考readme文件,里面介紹的很詳細(xì)。如果使用VC2008,也可以直接下載lua_vc2008.rar

      4,lua如何進(jìn)行網(wǎng)絡(luò)編程?

      通過luasocket這個(gè)擴(kuò)展庫(kù)。具體信息可以在http://luasocket./ 找到,另外Lua for windows附帶了luasocket,安裝后可以直接使用。、

      5.1,lua可不可以與c交互?

      在PIL以及Lua manual上介紹了如何使用c語(yǔ)言編寫lua的第三方擴(kuò)展,另外可以參考我的文章與示例代碼http:///?p=1498

      c語(yǔ)言中調(diào)用lua也非常方便,可以靜態(tài)調(diào)用(通過lib),也可以動(dòng)態(tài)調(diào)用(通過dll),使用lua增強(qiáng)c語(yǔ)言這樣靜態(tài)編譯語(yǔ)言的能力是非常有趣的。

      5.2,lua可不可以與c++交互?

      c++可以通過c語(yǔ)言的方式與lua交互。另外c++可以通過luabind或者luaplus這樣的第三方庫(kù)支暴露類與類成員信息給lua使用,可以方便(?)c++開發(fā)者。

      我個(gè)人對(duì)于c++與lua交互的看法可以參考勿用屠龍來殺豬-論如何正確整合Lua與C++

      5.3,lua可不可以與dotnet交互?

      可以通過luainterface這個(gè)項(xiàng)目在lua中使用dotnet platform,或者在c# 中使用Lua,但是這個(gè)項(xiàng)目的穩(wěn)定度與成熟度都還達(dá)不到可用的標(biāo)準(zhǔn)。

      5.4,lua可不可以直接調(diào)用windows api?

      通過lua alien這個(gè)擴(kuò)展庫(kù)

      6,lua除了編寫魔獸世界的插件,還能做什么?

      可以用lua來寫一些常用的程序,比如操作excel,比如定制一些查找。還可以把lua作為一種配置方式(類似ini文件或者cfg文件),因?yàn)閘ua的表,可以達(dá)到非常復(fù)雜的配置功能,另外lua的解析速度要比xml快多了。當(dāng)然lua主要用處還是作為游戲的腳本支持語(yǔ)言。

      7,lua可以調(diào)用windows api么?可以調(diào)用COM組件么?

      可以自己編寫一個(gè)dll封裝對(duì)windows api的調(diào)用,或者用alien這個(gè)模塊??梢酝ㄟ^luacom來調(diào)用COM組件。BTW,通過COM組件調(diào)用可以實(shí)現(xiàn)對(duì)excel或者word的操作。

      云風(fēng)介紹了一種windows api調(diào)用的方法:http://blog./cloud/LuaApiCall

      8,學(xué)習(xí)、使用lua有什么必須知道的網(wǎng)站么?

      http://lua-users.org

      http:///

      http:///

      http:///

      http://www./

      另外在云風(fēng)http://blog./的博客上也有不少關(guān)于Lua的好文章。

      9,C/C++調(diào)用lua(比如使用dofile)常見的問題?

      C++調(diào)用lua,必須用絕對(duì)路徑(c:\aaa\bbb.lua)而不是相對(duì)路徑。否則Lua虛擬機(jī)找不到這個(gè)文件。

      10,Lua可以編譯后執(zhí)行么?

      可以通過luac將lua代碼編譯成Lua的虛擬機(jī)指令集。這樣可以隱藏原來代碼,在一些內(nèi)存或者CPU受限的環(huán)境下直接使用編譯后的虛擬機(jī)也可節(jié)省硬件資源。

      11,Lua能面向?qū)ο竺??Lua為什么沒有類?Lua為什么沒有多態(tài)?Lua為什么沒有C++或者Java或者C#的這種那種特性?

      Lua是一種單獨(dú)的語(yǔ)言!在語(yǔ)言的特性以及實(shí)現(xiàn)上,Lua設(shè)計(jì)者有他們的取舍。高效、簡(jiǎn)潔、方便是Lua的特點(diǎn)。Lua的面向?qū)ο筇匦灶愃艼avascript,都是基于原型機(jī)制(而非類機(jī)制)實(shí)現(xiàn)。類不是面向?qū)ο蟮谋匾匦?。Lua的變量沒有類型定義(值value有),所以也不存在多態(tài)這種機(jī)制,就如同c++不容易實(shí)現(xiàn)duck typing一樣,取舍取舍,取了這樣自然要舍棄那樣。

      在Lua中實(shí)現(xiàn)OO特性,可以參考下面的鏈接:http:///wiki/ObjectOrientedProgramming

      或者在luaforge上搜索object,可以找到很多相關(guān)項(xiàng)目,如LOOP。

      另外在PIL中也介紹了如何實(shí)現(xiàn)OO的方法。也可以參考云風(fēng)的實(shí)現(xiàn)方式:http://blog./cloud/LuaOO

      12,Lua是否支持Unicode字符串?

      Lua字符串可以容納任何字符(包括0),所以如果想把unicode字符存到Lua字符串中沒有任何問題,但是Lua的string標(biāo)準(zhǔn)庫(kù)只能處理單字節(jié),所以想編程使用Unicode,需要另外支持,如icu4lua,詳細(xì)信息參考:

      http:///wiki/LuaUnicode

      13,a.f(x)與a:f(x)有什么區(qū)別?

      簡(jiǎn)單的說,a:f(x)是a.f(a, x)的一種簡(jiǎn)寫形式,更方便函數(shù)調(diào)用。

      14,require與dofile有什么區(qū)別?

      這兩個(gè)函數(shù)都會(huì)載入并且運(yùn)行l(wèi)ua腳本,區(qū)別是,require只需要指定模塊名字(不需要加入.lua .dll這樣后綴),而dofile需要指定文件的完整的實(shí)際路徑。

      在windows下輸入以下命令lua -e "print(package.path)"來顯示package查找路徑。

      第二個(gè)區(qū)別是require會(huì)記住load過的信息,重復(fù)調(diào)用不會(huì)導(dǎo)致模塊被重新載入(reload)。(我們可以通過dofile這種特性來實(shí)現(xiàn)熱更新)

      第三個(gè)區(qū)別是require可以載入二進(jìn)制模塊,如c語(yǔ)言編寫的動(dòng)態(tài)庫(kù),可以通過package.cpath來顯示動(dòng)態(tài)庫(kù)查找的路徑信息。

      如果你想載入的動(dòng)態(tài)庫(kù)是在某個(gè)子目錄下,如c:\lua\5.1\lib\luasockets\core,可以通過點(diǎn)號(hào)形式來require,如require “socket.core”

      15,如何顯式載入一個(gè)二進(jìn)制動(dòng)態(tài)庫(kù)(dll)?

      可以通過package.loadlib來實(shí)現(xiàn)。

      16,Lua有什么優(yōu)化技巧么?

      可以通過LuaProfiler來查看你程序中的瓶頸http://luaprofiler.,另外Lua gems中有篇文章非常值得參考Lua Performance Tips

      也可以到http:///wiki/OptimisationCodingTips 來查看他人的經(jīng)驗(yàn)。

      17,Lua有exception機(jī)制么?

      沒有內(nèi)置的,但是可以通過pcall來間接實(shí)現(xiàn)。
      local status,err = pcall(function()
      t.alpha = 2.0 — will throw an error if t is nil or not a table
      end)

      if not status then
      print(err)
      end

      18,Lua與C交互時(shí),能否管理用戶對(duì)象的生存期?

      在The Implementation of Lua5.0中有介紹,userdata可以認(rèn)為是用戶指定的一塊內(nèi)存指針,分兩種:Heavy userdata是由Lua來做內(nèi)存分配并且管理GC的,而Light userdata完全由用戶掌控內(nèi)存分配銷毀。

      也可以參考云風(fēng)的一篇文章:http://blog./2007/10/lua_c_object_reference.html

      19,優(yōu)化的尾調(diào)用optimized tail calls可以做什么?

      狀態(tài)機(jī)實(shí)現(xiàn):
      – Define State A
      function A()
      dosomething”in state A”
      if somecondition() then return B() end
      if done() then return end
      return A()
      end

      – Define State B
      function B()
      dosomething”in state B”
      if othercondition() then return A() end
      return B()
      end

      – Run the FSM, starting in State A
      A()

      20,我想把lua打包成exe,如何做?

      可以使用srlua、L-Bia這樣的lua項(xiàng)目,另外可以使用lua2c這個(gè)工具把lua代碼編譯成c語(yǔ)言代碼,然后通過include在c語(yǔ)言中直接使用。

      21,什么是函數(shù)環(huán)境Function Environments?

      簡(jiǎn)單的說,函數(shù)環(huán)境就是全局表global table??梢杂脕韺?shí)現(xiàn)sandbox沙箱功能。
      function test ()
      return A + 2*B
      end
      t = { A = 10; B = 20 }
      setfenv(test,t)
      print(test())
      =>
      50

      22,如何實(shí)現(xiàn)命名參數(shù)named parameters?
      function named(t)
      local name = t.name or ‘a(chǎn)nonymous’
      local os = t.os or ‘<unknown>’
      local email = t.email or t.name..’@’..t.os

      end
      named {name = ‘bill’, os = ‘windows’}

      23,Lua有沒有Ruby gem這種機(jī)制?

      如果想自動(dòng)安裝更新第三方模塊,可以使用luarocks。

      24,Lua支持字符串正則查找替換么?

      支持,參考string標(biāo)準(zhǔn)庫(kù)。也可以使用lpeg這個(gè)第三方模塊。

      25,如何在c語(yǔ)言中遍歷一個(gè)Lua table?
      /* table is in the stack at index ‘t’ */
      lua_pushnil(L); /* first key */
      while (lua_next(L, t) != 0) {
      /* uses ‘key’ (at index -2) and ‘value’ (at index -1) */
      printf(“%s – %s\n”,
      lua_typename(L, lua_type(L, -2)),
      lua_typename(L, lua_type(L, -1)));

      /* removes ‘value’; keeps ‘key’ for next iteration */
      lua_pop(L, 1);
      }

      26 使用Lua stack需要注意的地方?
      在 C 函數(shù)中,不能隨意的時(shí)候 lua_State 中的虛擬機(jī)堆棧,如果需要大量使用堆棧,應(yīng)該先調(diào)用 lua_checkstack 。少量使用堆棧,(在 LUA_MINSTACK 20 )之下時(shí)則沒有問題。(from云風(fēng)blog)

      27 當(dāng)從 lua 調(diào)用 C 函數(shù)時(shí),當(dāng)參數(shù)數(shù)量不足的時(shí)候,并不會(huì)填入 nil 作為缺省參數(shù)。比如,寫了一個(gè) C 函數(shù),接受兩個(gè)參數(shù)。當(dāng) lua 中調(diào)用這個(gè) C 函數(shù)時(shí),如果僅傳入一個(gè)參數(shù),那么在 C 中 stack 上 index 2 位置的值并不一定是 nil 。這個(gè)時(shí)候我們應(yīng)該用 lua_gettop 得到準(zhǔn)確的參數(shù)個(gè)數(shù)以做適當(dāng)?shù)奶幚恚蛘咧苯釉谶M(jìn)入 C 函數(shù)時(shí)調(diào)用一次 lua_settop(L,2) 強(qiáng)制堆棧擴(kuò)展到兩個(gè)。

      28 在生成 cclosure 的時(shí)候,upvalue 不能超過 255 個(gè)。而這一點(diǎn)并沒在文檔中說明,運(yùn)行時(shí)壓入超過 255 個(gè) upvalue 也不會(huì)報(bào)錯(cuò)。

      以上3條來自http://blog./2006/09/lua_cclosure_upvalue.html

      29 判斷一個(gè)字符串的前綴是不是 “@”
      有三個(gè)方案:

      1. 比較直觀的是 string.sub(str,1,1) == “@”
      2. 感覺效率比較高的是 string.byte(str) == 64
      3. 或者是 string.find(str,”@”) == 1

      30 http://www./demo.html 這個(gè)演示功能怎么實(shí)現(xiàn)的?

      http://www.tecgraf./~lhf/ftp/lua/,查找“demo”能看到它的源代碼。

      31 mav · An experimental tool for memory allocation visualization. Need to add

      32 樹形打印table,類似php的print_r

      from http://blog./cloud/LuaPrintR
      local print = print
      local tconcat = table.concat
      local tinsert = table.insert
      local srep = string.rep
      local type = type
      local pairs = pairs
      local tostring = tostring
      local next = next
      function print_r(root)
      local cache = { [root] = “.” }
      local function _dump(t,space,name)
      local temp = {}
      for k,v in pairs(t) do
      local key = tostring(k)
      if cache[v] then
      tinsert(temp,”+” .. key .. ” {” .. cache[v]..”}”)
      elseif type(v) == “table” then
      local new_key = name .. “.” .. key
      cache[v] = new_key
      tinsert(temp,”+” .. key .. _dump(v,space .. (next(t,k) and “|” or ” ” ).. srep(” “,#key),new_key))
      else
      tinsert(temp,”+” .. key .. ” [" .. tostring(v).."]“)
      end
      end
      return tconcat(temp,”\n”..space)
      end
      print(_dump(root, “”,”"))
      end

      33 如何可以安全的迭代一個(gè)table

      http://blog./2009/03/safe_set.html

      34 lua編譯時(shí)計(jì)算實(shí)現(xiàn)

      http://blog./2008/08/compile_time_calculation_in_lua.html

      35 如何通過closure模擬table
      from http://blog./2006/03/closure_table.html
      function point (x,y)
      return function () return x,y end
      end
      可以用 point(1,2) 構(gòu)造一個(gè) point 。它比 {1,2} 輕量。
      還可以有一個(gè)更復(fù)雜一點(diǎn)的實(shí)現(xiàn):
      function point (x,y)
      return function (idx)
      if idx==”x” then return x
      elseif idx==”y” then return y
      else return x,y end
      end
      end

      36

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多