2 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超8個贊
原因如下:
for i,v in pairs(t) do ... end,這其實(shí)只是泛型for的普通用法,for有2種用法第一種是 for i = 1,10,1 do print(i) end 這種 當(dāng)計數(shù)器用的。
第二種是泛型for,for a,b,c,d,e in fun1(para) do ... end。
等價于,local fun2 = fun1(para),while true do a,b,c,d,e = fun2(), if a then,break else ......(這里就是上面寫在do里面的內(nèi)容) end,這里要求的就是fun1的返回值必須是一個迭代函數(shù) 不然就計算不完了。
lua中的泛型for直接使用talbe的原因:
當(dāng)我在工作中使用lua 進(jìn)行開發(fā)時,發(fā)現(xiàn)在lua 中有4種方式遍歷一個table ,當(dāng)然,從本質(zhì)上來說其實(shí)都一樣,只是形式不同。
XXX 15. end 前兩種是泛型遍歷,后兩種是數(shù)值型遍歷。當(dāng)然你還會說lua 的table 遍歷還有很多種方法啊,沒錯,不過最常見的這些遍歷確實(shí)有必要弄清楚。
這四種方式各有特點(diǎn),由于在工作中我?guī)缀趺刻於紩褂帽闅vtable 的方法,一開始也非常困惑這些方式的不同,一段時間后才漸漸明白,這里我也是把自己的一點(diǎn)經(jīng)驗(yàn)告訴大家,對跟我一樣的lua 初學(xué)者也許有些幫助(至少當(dāng)初我在寫的時候在網(wǎng)上就找了很久,不知道是因?yàn)榇笈兌颊J(rèn)為這些很簡單,不需要說,還是因?yàn)槲冶?,連這都要問)。
準(zhǔn)確來說lua 中的table 更加像是C++中的map ,通過Key 對應(yīng)存儲Value ,但是并非順序來保存key-value 對,而是使用了hash 的方式,這樣能夠更加快速的訪問key 對應(yīng)的value ,我們也知道hash 表的遍歷需要使用所謂的迭代器來進(jìn)行,同樣,lua 也有自己的迭代器,就是上面4種遍歷方式中的pairs 和ipairs 遍歷。
但是lua 同時提供了按照key 來遍歷的方式(另外兩種,實(shí)質(zhì)上是一種),正式因?yàn)樗峁┝诉@種按key 的遍歷,才造成了我一開始的困惑,我一度認(rèn)為lua 中關(guān)于table 的遍歷是按照我table 定義key 的順序來的。

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個贊
泛型方法:
是否擁有泛型方法,與其所在的類是否泛型沒有關(guān)系。要定義泛型方法,只需將泛型參數(shù)列表置于返回值前。如:
public class ExampleA {
public <T> void f(T x) {
System.out.println(x.getClass().getName());
}
public static void main(String[] args) {
ExampleA ea = new ExampleA();
ea.f(" ");
ea.f(10);
ea.f('a');
ea.f(ea);
}
}
輸出結(jié)果:
java.lang.String
java.lang.Integer
java.lang.Character
ExampleA
使用泛型方法時,不必指明參數(shù)類型,編譯器會自己找出具體的類型。泛型方法除了定義不同,調(diào)用就像普通方法一樣。
需要注意,一個static方法,無法訪問泛型類的類型參數(shù),所以,若要static方法需要使用泛型能力,必須使其成為泛型方法。
- 2 回答
- 0 關(guān)注
- 730 瀏覽
添加回答
舉報