test = "the,quick,brown,dog,jumped"
t = utils.split (test, ",")
tprint (t)
print (table.concat (t, ","))
Output:
1="the"
2="quick"
3="brown"
4="dog"
5="jumped"
the,quick,brown,dog,jumped
t = utils.split (test, ",", 2)
tprint (t)
Output:
1="the"
2="quick"
3="brown,dog,jumped"
static int l_split (lua_State *L) {
const char *s = luaL_checkstring(L, 1);
const char *sep = luaL_checkstring(L, 2);
const int count = (int) luaL_optnumber (L, 3, 0);
char *e;
int i = 1;
if (strlen (sep) != 1)
luaL_error (L, "Separator must be a single character");
if (count < 0)
luaL_error (L, "Count must be positive or zero");
lua_newtable(L); /* result */
/* repeat for each separator */
while ((e = strchr(s, *sep)) != NULL &&
(count == 0 || i <= count))
{
lua_pushlstring(L, s, e-s); /* push substring */
lua_rawseti(L, -2, i++);
s = e + 1; /* skip separator */
}
/* push last substring */
lua_pushstring(L, s);
lua_rawseti(L, -2, i);
return 1; /* return the table */
}
function split (s, delim)
assert (type (delim) == "string" and string.len (delim) > 0,
"bad delimiter")
local start = 1
local t = {} -- results table
-- find each instance of a string followed by the delimiter
while true do
local pos = string.find (s, delim, start, true) -- plain find
if not pos then
break
end
table.insert (t, string.sub (s, start, pos - 1))
start = pos + string.len (delim)
end -- while
-- insert final one (after last delimiter)
table.insert (t, string.sub (s, start))
return t
end -- function split
function f1(n)
聽聽 -- 鍑芥暟鍙傛暟涔熸槸灞閮ㄥ彉閲?/font>
聽聽 local function f2()
聽聽聽聽聽 print(n) -- 寮曠敤澶栧寘鍑芥暟鐨勫眬閮ㄥ彉閲?/font>
聽聽 end
聽聽 return f2
end
g1 = f1(1979)
g1() -- 鎵撳嵃鍑?979
g2 = f1(500)
g2() -- 鎵撳嵃鍑?00
褰撴墽琛屽畬g1 = f1(1979)鍚庯紝灞閮ㄥ彉閲弉鐨勭敓鍛芥湰璇ョ粨鏉燂紝浣嗗洜涓哄畠宸茬粡鎴愪簡鍐呭祵鍑芥暟f2(瀹冨張琚祴緇欎簡鍙橀噺 g1)鐨剈pvalue錛屾墍浠ュ畠浠嶇劧鑳戒互鏌愮褰㈠紡緇х畫鈥滃瓨媧燴濅笅鏉ワ紝浠庤屼護g1()鎵撳嵃鍑烘紜殑鍊箋?/font>
聽聽聽 鍙負浠涔坓2涓巊1鐨勫嚱鏁頒綋涓鏍?閮芥槸f1鐨勫唴宓屽嚱鏁癴2鐨勫嚱鏁頒綋)錛屼絾鎵撳嵃鍊間笉鍚岋紵榪欏氨娑夊強鍒頒竴涓浉褰撻噸瑕?/font> 鐨勬蹇碘斺旈棴鍖?closure)銆備簨瀹炰笂錛孡ua緙栬瘧涓涓嚱鏁版椂錛屼細涓哄畠鐢熸垚涓涓師鍨?prototype)錛屽叾涓寘鍚簡 鍑芥暟浣撳搴旂殑铏氭嫙鏈烘寚浠ゃ佸嚱鏁扮敤鍒扮殑甯擱噺鍊?鏁幫紝鏂囨湰瀛楃涓茬瓑絳?鍜屼竴浜涜皟璇曚俊鎭傚湪榪愯鏃訛紝姣忓綋Lua鎵ц 涓涓艦濡俧unction...end 榪欐牱鐨勮〃杈懼紡鏃訛紝瀹冨氨浼氬垱寤轟竴涓柊鐨勬暟鎹璞★紝鍏朵腑鍖呭惈浜嗙浉搴斿嚱鏁板師鍨嬬殑寮曠敤 銆佺幆澧?environment錛岀敤鏉ユ煡鎵懼叏灞鍙橀噺鐨勮〃)鐨勫紩鐢ㄤ互鍙婁竴涓敱鎵鏈塽pvalue寮曠敤緇勬垚鐨勬暟緇勶紝鑰岃繖涓暟鎹?/font> 瀵硅薄灝辯О涓洪棴鍖呫傜敱姝ゅ彲瑙侊紝鍑芥暟鏄紪璇戞湡姒傚康錛屾槸闈欐佺殑錛岃岄棴鍖呮槸榪愯鏈熸蹇碉紝鏄姩鎬佺殑銆俫1鍜実2鐨勫間弗鏍?/font> 鏉ヨ涓嶆槸鍑芥暟鑰屾槸闂寘錛屽茍涓旀槸涓や釜涓嶇浉鍚岀殑闂寘錛岃屾瘡涓棴鍖呭彲浠ヤ繚鏈夎嚜宸辯殑upvalue鍊鹼紝鎵浠1鍜実2鎵撳嵃鍑?/font> 鐨勭粨鏋滃綋鐒跺氨涓嶄竴鏍蜂簡銆傝櫧鐒墮棴鍖呭拰鍑芥暟鏄湰璐ㄤ笉鍚岀殑姒傚康錛屼絾涓轟簡鏂逛究錛屼笖鍦ㄤ笉寮曡搗娣鋒穯鐨勬儏鍐典笅錛屾垜浠瀹?/font> 浠笉鍋氬尯鍒嗐?/font>
聽聽聽 浣跨敤upvalue寰堟柟渚匡紝浣嗗畠浠殑璇箟涔熷緢寰錛岄渶瑕佸紩璧鋒敞鎰忋傛瘮濡傚皢f1鍑芥暟鏀規(guī)垚錛?/font>
function f1(n)
聽聽 local function f2()
聽聽聽聽聽 print(n)
聽聽 end
聽聽 n = n + 10
聽聽 return f2
end
g1 = f1(1979)
g1() -- 鎵撳嵃鍑?989
鍐呭祵鍑芥暟瀹氫箟鍦╪ = n + 10榪欐潯璇彞涔嬪墠錛屽彲涓轟粈涔坓1()鎵撳嵃鍑虹殑鍗存槸1989錛焨pvalue瀹為檯鏄眬閮ㄥ彉閲忥紝鑰?/font> 灞閮ㄥ彉閲忔槸淇濆瓨鍦ㄥ嚱鏁板爢鏍堟鏋朵笂(stack frame)鐨勶紝鎵浠ュ彧瑕乽pvalue榪樻病鏈夌寮鑷繁鐨勪綔鐢ㄥ煙錛屽畠?yōu)兏鐩?/font> 鐢熷瓨鍦ㄥ嚱鏁板爢鏍堜笂銆傝繖縐嶆儏鍐典笅錛岄棴鍖呭皢閫氳繃鎸囧悜鍫嗘爤涓婄殑upvalue鐨勫紩鐢ㄦ潵璁塊棶瀹冧滑錛屼竴鏃pvalue鍗沖皢紱誨紑 鑷繁鐨勪綔鐢ㄥ煙(榪欎篃鎰忓懗鐫瀹冮┈涓婅浠庡爢鏍堜腑娑堝け)錛岄棴鍖呭氨浼氫負瀹冨垎閰嶇┖闂村茍淇濆瓨褰撳墠鐨勫鹼紝浠ュ悗渚垮彲閫氳繃鎸囧悜 鏂板垎閰嶇┖闂寸殑寮曠敤鏉ヨ闂upvalue銆傚綋鎵ц鍒癴1(1979)鐨刵 = n + 10鏃訛紝闂寘宸茬粡鍒涘緩浜嗭紝浣嗘槸n騫舵病鏈夌 寮浣滅敤鍩燂紝鎵浠ラ棴鍖呬粛鐒跺紩鐢ㄥ爢鏍堜笂鐨刵錛屽綋return f2瀹屾垚鏃訛紝n鍗沖皢緇撴潫鐢熷懡錛屾鏃墮棴鍖呬究灝唍(宸茬粡鏄?989 浜?澶嶅埗鍒拌嚜宸辯鐞嗙殑絀洪棿涓互渚垮皢鏉ヨ闂傚紕娓呮浜嗗唴閮ㄧ殑縐樺瘑鍚庯紝榪愯緇撴灉灝變笉闅捐В閲婁簡銆?/font>
聽聽聽 upvalue榪樺彲浠ヤ負闂寘涔嬮棿鎻愪緵涓縐嶆暟鎹叡浜殑鏈哄埗銆傝瘯鐪嬩笅渚嬶細
function Create(n)
聽聽 local function foo1()
聽聽聽聽聽 print(n)
聽聽 end
聽聽 local function foo2()
聽聽聽聽聽 n = n + 10
聽聽 end
聽聽 return foo1,foo2
end
f1,f2 = Create(1979)
f1() -- 鎵撳嵃1979
f2()
f1() -- 鎵撳嵃1989
f2()
f1() -- 鎵撳嵃1999
f1,f2榪欎袱涓棴鍖呯殑鍘熷瀷鍒嗗埆鏄疌reate涓殑鍐呭祵鍑芥暟foo1鍜宖oo2錛岃宖oo1鍜宖oo2寮曠敤鐨剈pvalue鏄悓涓涓紝 鍗矯reate鐨勫眬閮ㄥ彉閲弉銆傚墠闈㈠凡璇磋繃錛屾墽琛屽畬Create璋冪敤鍚庯紝闂寘浼氭妸鍫嗘爤涓妌鐨勫煎鍒跺嚭鏉ワ紝閭d箞鏄惁f1鍜宖2 灝卞垎鍒嫢鏈変竴涓猲鐨勬嫹璐濆憿錛熷叾瀹炰笉鐒訛紝褰揕ua鍙戠幇涓や釜闂寘鐨剈pvalue鎸囧悜鐨勬槸褰撳墠鍫嗘爤涓婄殑鐩稿悓鍙橀噺鏃訛紝浼氳仾 鏄庡湴鍙敓鎴愪竴涓嫹璐濓紝鐒跺悗璁╄繖涓や釜闂寘鍏變韓璇ユ嫹璐濓紝榪欐牱浠諱竴涓棴鍖呭璇pvalue榪涜淇敼閮戒細琚彟涓涓帰鐭?/font> 銆備笂榪頒緥瀛愬緢娓呮鍦拌鏄庝簡榪欑偣錛氭瘡嬈¤皟鐢╢2閮藉皢upvalue鐨勫煎鍔犱簡10錛岄殢鍚巉1灝嗘洿鏂板悗鐨勫兼墦鍗板嚭鏉ャ?/font> upvalue鐨勮繖縐嶈涔夊緢鏈変環(huán)鍊鹼紝瀹冧嬌寰楅棴鍖呬箣闂村彲浠ヤ笉渚濊禆鍏ㄥ眬鍙橀噺榪涜閫氳錛屼粠鑰屼嬌浠g爜鐨勫彲闈犳уぇ澶ф彁楂樸?/font>
聽聽聽 闂寘鍦ㄥ垱寤轟箣鏃跺叾upvalue灝卞凡緇忎笉鍦ㄥ爢鏍堜笂鐨勬儏鍐典篃鏈夊彲鑳藉彂鐢燂紝榪欐槸鍥犱負鍐呭祵鍑芥暟鍙互寮曠敤鏇村灞傚鍖呭嚱鏁?/font> 鐨勫眬閮ㄥ彉閲忥細
function Test(n)
聽聽 local function foo()
聽聽聽聽聽 local function inner1()
聽聽聽聽聽聽聽聽 print(n)
聽聽聽聽聽 end
聽聽聽聽聽 local function inner2()
聽聽聽聽聽聽聽聽 n = n + 10
聽聽聽聽聽 end
聽聽聽聽聽 return inner1,inner2
聽聽 end
聽聽 return foo
end
t = Test(1979)
f1,f2 = t()
f1()聽聽聽聽聽聽聽 -- 鎵撳嵃1979
f2()
f1()聽聽聽聽聽聽聽 -- 鎵撳嵃1989
g1,g2 = t()
g1()聽聽聽聽聽聽聽 -- 鎵撳嵃1989
g2()
g1()聽聽聽聽聽聽聽 -- 鎵撳嵃1999
f1()聽聽聽聽聽聽聽 -- 鎵撳嵃1999
鎵ц瀹宼 = Test(1979)鍚庯紝Test鐨勫眬閮ㄥ彉閲弉灝扁滄鈥濅簡錛屾墍浠ュ綋f1,f2榪欎袱涓棴鍖呰鍒涘緩鏃跺爢鏍堜笂鏍規(guī)湰鎵句笉鍒?/font> n鐨勮釜褰憋紝榪欏彨瀹冧滑濡備綍鍙栧緱n鐨勫煎憿錛熷懙鍛碉紝涓嶈蹇樹簡Test鍑芥暟鐨刵涓嶄粎浠呮槸inner1鍜宨nner2鐨剈pvalue錛屽悓 鏃跺畠涔熸槸foo鐨剈pvalue銆倀 = Test(1979)涔嬪悗錛宼榪欎釜闂寘涓瀹氬凡緇忔妸n濡ュ杽淇濆瓨濂戒簡錛屼箣鍚巉1銆乫2濡傛灉鍦?/font> 褰撳墠鍫嗘爤涓婃壘涓嶅埌n灝變細鑷姩鍒板畠浠殑澶栧寘闂寘(濮戜笖榪欎箞鍙?鐨剈pvalue寮曠敤鏁扮粍涓幓鎵撅紝騫舵妸鎵懼埌鐨勫紩鐢ㄥ兼嫹 璐濆埌鑷繁鐨剈pvalue寮曠敤鏁扮粍涓備粩緇嗚瀵熶笂榪頒唬鐮侊紝鍙互鍒ゅ畾g1鍜実2涓巉1鍜宖2鍏變韓鍚屼竴涓猽pvalue銆傝繖鏄負 浠涔堝憿錛熷叾瀹烇紝g1鍜実2涓巉1鍜宖2閮芥槸鍚屼竴涓棴鍖?t)鍒涘緩鐨勶紝鎵浠ュ畠浠紩鐢ㄧ殑upvalue(n)瀹為檯涔熸槸鍚屼竴涓彉閲?/font> 錛岃屽垰鎵嶆弿榪扮殑鎼滅儲鏈哄埗鍒欎繚璇佷簡鏈鍚庡畠浠殑upvalue寮曠敤閮戒細鎸囧悜鍚屼竴涓湴鏂廣?/font>
聽聽聽 Lua灝嗗嚱鏁板仛涓哄熀鏈被鍨嬪煎茍鏀寔璇嶆硶瀹氱晫鐨勭壒鎬т嬌寰楄璦鍏鋒湁寮哄ぇ鐨勬娊璞¤兘鍔涖傝岄忓交璁よ瘑鍑芥暟銆侀棴鍖呭拰 upvalue灝嗗府鍔╃▼搴忓憳鍠勭敤榪欑鑳藉姏銆?/font>