成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > Lua中的元表與元方法學(xué)習(xí)總結(jié)

Lua中的元表與元方法學(xué)習(xí)總結(jié)

熱門標(biāo)簽:如何利用高德地圖標(biāo)注家 百度地圖標(biāo)注位置網(wǎng)站 開通400電話申請(qǐng)流程 武漢百應(yīng)人工智能電銷機(jī)器人 智能語(yǔ)音電銷的機(jī)器人 揚(yáng)州電銷外呼系統(tǒng)軟件 電腦外呼系統(tǒng)輻射大嗎 400手機(jī)電話免費(fèi)辦理 上海企業(yè)外呼系統(tǒng)排名

前言

元表對(duì)應(yīng)的英文是metatable,元方法是metamethod。我們都知道,在C++中,兩個(gè)類是無法直接相加的,但是,如果你重載了“+”符號(hào),就可以進(jìn)行類的加法運(yùn)算。在Lua中也有這個(gè)道理,兩個(gè)table類型的變量,你是無法直接進(jìn)行“+”操作的,如果你定義了一個(gè)指定的函數(shù),就可以進(jìn)行了。那這篇博文就是主要講的如何定義這個(gè)指定的函數(shù),這個(gè)指定的函數(shù)是什么?希望對(duì)學(xué)習(xí)Lua的朋友有幫助。

Lua是怎么做的?

通常,Lua中的每個(gè)值都有一套預(yù)定義的操作集合,比如數(shù)字是可以相加的,字符串是可以連接的,但是對(duì)于兩個(gè)table類型,則不能直接進(jìn)行“+”操作。這需要我們進(jìn)行一些操作。在Lua中有一個(gè)元表,也就是上面說的metatable,我們可以通過元表來修改一個(gè)值得行為,使其在面對(duì)一個(gè)非預(yù)定義的操作時(shí)執(zhí)行一個(gè)指定的操作。比如,現(xiàn)在有兩個(gè)table類型的變量a和b,我們可以通過metatable定義如何計(jì)算表達(dá)式a+b,具體的在Lua中是按照以下步驟進(jìn)行的:

先判斷a和b兩者之一是否有元表;
檢查該元表中是否有一個(gè)叫__add的字段;
如果找到了該字段,就調(diào)用該字段對(duì)應(yīng)的值,這個(gè)值對(duì)應(yīng)的是一個(gè)metamethod;(Lua中方法是可以放在一個(gè)字段中的,還記得???忘了點(diǎn)這里)
調(diào)用__add對(duì)應(yīng)的metamethod計(jì)算a和b的值。
上述四個(gè)步驟就是計(jì)算table類型變量a+b的過程。在Lua中,每個(gè)值都有一個(gè)元表,table和userdata類型的每個(gè)變量都可以有各自獨(dú)立的元表,而其他類型的值則共享其類型所屬的單一元表。

告別metatable小白

現(xiàn)在就說說最基本的metatable內(nèi)容。Lua在創(chuàng)建新的table時(shí)不會(huì)創(chuàng)建元表,比如以下代碼就可以演示:

復(fù)制代碼 代碼如下:

local t = {1, 2}
print(getmetatable(t))     -- nil

我們是使用getmetatable來獲取一個(gè)table或userdata類型變量的元表,當(dāng)創(chuàng)建新的table變量時(shí),使用getmetatable去獲得元表,將返回nil;同理,我們也可以使用setmetatable去設(shè)置一個(gè)table或userdata類型變量的元表,例如以下代碼:
復(fù)制代碼 代碼如下:

local t = {}
print(getmetatable(t))     -->nil
 
local t1 = {}
setmetatable(t, t1)
assert(getmetatable(t) == t1)

任何table都可以作為任何值得元表,而一組相關(guān)的table有可以共享一個(gè)通用的元表,此元表描述了它們共同的行為。一個(gè)table甚至可以作為它自己的元表,用于描述其特有的行為??傊?,任何搭配形式都是合法的。

在Lua代碼中,只能設(shè)置table的元表。若要設(shè)置其它類型的值得元表,則必須通過C代碼來完成。還存在一個(gè)特例,對(duì)于字符串,標(biāo)準(zhǔn)的字符串程序庫(kù)為所有的字符串都設(shè)置了一個(gè)元表,而其它類型在默認(rèn)情況下都沒有元表。查看兩句代碼的打印值,就可以看出來:

復(fù)制代碼 代碼如下:

print(getmetatable("Hello World"))
print(getmetatable(10))

在table中,我可以重新定義的元方法有以下幾個(gè):

復(fù)制代碼 代碼如下:

__add(a, b) --加法
__sub(a, b) --減法
__mul(a, b) --乘法
__div(a, b) --除法
__mod(a, b) --取模
__pow(a, b) --乘冪
__unm(a) --相反數(shù)
__concat(a, b) --連接
__len(a) --長(zhǎng)度
__eq(a, b) --相等
__lt(a, b) --小于
__le(a, b) --小于等于
__index(a, b) --索引查詢
__newindex(a, b, c) --索引更新(PS:不懂的話,后面會(huì)有講)
__call(a, ...) --執(zhí)行方法調(diào)用
__tostring(a) --字符串輸出
__metatable --保護(hù)元表

接下來就介紹介紹如果去重新定義這些方法。

算術(shù)類的元方法

現(xiàn)在我使用完整的實(shí)例代碼來詳細(xì)的說明算術(shù)類元方法的使用。我準(zhǔn)備定義一些對(duì)集合的操作方法,所有的方法都放入Set這個(gè)table中,至于為什么table中可以存放函數(shù),可以參考《Lua中的函數(shù)》這篇文章。下面的代碼是我模擬的一個(gè)集合的操作:

復(fù)制代碼 代碼如下:

Set = {}
local mt = {} -- 集合的元表
 
-- 根據(jù)參數(shù)列表中的值創(chuàng)建一個(gè)新的集合
function Set.new(l)
    local set = {}
     setmetatable(set, mt)
    for _, v in pairs(l) do set[v] = true end
     return set
end
 
-- 并集操作
function Set.union(a, b)
    local retSet = Set.new{} -- 此處相當(dāng)于Set.new({})
    for v in pairs(a) do retSet[v] = true end
    for v in pairs(b) do retSet[v] = true end
    return retSet
end
 
-- 交集操作
function Set.intersection(a, b)
    local retSet = Set.new{}
    for v in pairs(a) do retSet[v] = b[v] end
    return retSet
end
 
-- 打印集合的操作
function Set.toString(set)
     local tb = {}
     for e in pairs(set) do
          tb[#tb + 1] = e
     end
     return "{" .. table.concat(tb, ", ") .. "}"
end
 
function Set.print(s)
     print(Set.toString(s))
end

現(xiàn)在,我定義“+”來計(jì)算兩個(gè)集合的并集,那么就需要讓所有用于表示集合的table共享一個(gè)元表,并且在該元表中定義如何執(zhí)行一個(gè)加法操作。首先創(chuàng)建一個(gè)常規(guī)的table,準(zhǔn)備用作集合的元表,然后修改Set.new函數(shù),在每次創(chuàng)建集合的時(shí)候,都為新的集合設(shè)置一個(gè)元表。代碼如下:

復(fù)制代碼 代碼如下:

Set = {}
local mt = {} -- 集合的元表
 
-- 根據(jù)參數(shù)列表中的值創(chuàng)建一個(gè)新的集合
function Set.new(l)
    local set = {}
     setmetatable(set, mt)
    for _, v in pairs(l) do set[v] = true end
     return set
end

在此之后,所有由Set.new創(chuàng)建的集合都具有一個(gè)相同的元表,例如:

復(fù)制代碼 代碼如下:

local set1 = Set.new({10, 20, 30})
local set2 = Set.new({1, 2})
print(getmetatable(set1))
print(getmetatable(set2))
assert(getmetatable(set1) == getmetatable(set2))

最后,我們需要把元方法加入元表中,代碼如下:

復(fù)制代碼 代碼如下:

mt.__add = Set.union

這以后,只要我們使用“+”符號(hào)求兩個(gè)集合的并集,它就會(huì)自動(dòng)的調(diào)用Set.union函數(shù),并將兩個(gè)操作數(shù)作為參數(shù)傳入。比如以下代碼:
復(fù)制代碼 代碼如下:

local set1 = Set.new({10, 20, 30})
local set2 = Set.new({1, 2})
local set3 = set1 + set2
Set.print(set3)

在上面列舉的那些可以重定義的元方法都可以使用上面的方法進(jìn)行重定義。現(xiàn)在就出現(xiàn)了一個(gè)新的問題,set1和set2都有元表,那我們要用誰的元表???雖然我們這里的示例代碼使用的都是一個(gè)元表,但是實(shí)際coding中,會(huì)遇到我這里說的問題,對(duì)于這種問題,Lua是按照以下步驟進(jìn)行解決的:

1.對(duì)于二元操作符,如果第一個(gè)操作數(shù)有元表,并且元表中有所需要的字段定義,比如我們這里的__add元方法定義,那么Lua就以這個(gè)字段為元方法,而與第二個(gè)值無關(guān);

2.對(duì)于二元操作符,如果第一個(gè)操作數(shù)有元表,但是元表中沒有所需要的字段定義,比如我們這里的__add元方法定義,那么Lua就去查找第二個(gè)操作數(shù)的元表;

3.如果兩個(gè)操作數(shù)都沒有元表,或者都沒有對(duì)應(yīng)的元方法定義,Lua就引發(fā)一個(gè)錯(cuò)誤。
以上就是Lua處理這個(gè)問題的規(guī)則,那么我們?cè)趯?shí)際編程中該如何做呢?比如set3 = set1 + 8這樣的代碼,就會(huì)打印出以下的錯(cuò)誤提示:

復(fù)制代碼 代碼如下:

lua: test.lua:16: bad argument #1 to 'pairs' (table expected, got number)

但是,我們?cè)趯?shí)際編碼中,可以按照以下方法,彈出我們定義的錯(cuò)誤消息,代碼如下:

復(fù)制代碼 代碼如下:

function Set.union(a, b)
     if getmetatable(a) ~= mt or getmetatable(b) ~= mt then
          error("metatable error.")
     end
 
    local retSet = Set.new{} -- 此處相當(dāng)于Set.new({})
    for v in pairs(a) do retSet[v] = true end
    for v in pairs(b) do retSet[v] = true end
    return retSet
end

當(dāng)兩個(gè)操作數(shù)的元表不是同一個(gè)元表時(shí),就表示二者進(jìn)行并集操作時(shí)就會(huì)出現(xiàn)問題,那么我們就可以打印出我們需要的錯(cuò)誤消息。

上面總結(jié)了算術(shù)類的元方法的定義,關(guān)系類的元方法和算術(shù)類的元方法的定義是類似的,這里不做累述。

__tostring元方法

寫過Java或者C#的人都知道,Object類中都有一個(gè)tostring的方法,程序員可以重寫該方法,以實(shí)現(xiàn)自己的需求。在Lua中,也是這樣的,當(dāng)我們直接print(a)(a是一個(gè)table)時(shí),是不可以的。那怎么辦,這個(gè)時(shí)候,我們就需要自己重新定義__tostring元方法,讓print可以格式化打印出table類型的數(shù)據(jù)。

函數(shù)print總是調(diào)用tostring來進(jìn)行格式化輸出,當(dāng)格式化任意值時(shí),tostring會(huì)檢查該值是否有一個(gè)__tostring的元方法,如果有這個(gè)元方法,tostring就用該值作為參數(shù)來調(diào)用這個(gè)元方法,剩下實(shí)際的格式化操作就由__tostring元方法引用的函數(shù)去完成,該函數(shù)最終返回一個(gè)格式化完成的字符串。例如以下代碼:

復(fù)制代碼 代碼如下:

mt.__tostring = Set.toString

如何保護(hù)我們的“奶酪”——元表

我們會(huì)發(fā)現(xiàn),使用getmetatable就可以很輕易的得到元表,使用setmetatable就可以很容易的修改元表,那這樣做的風(fēng)險(xiǎn)是不是太大了,那么如何保護(hù)我們的元表不被篡改呢?

在Lua中,函數(shù)setmetatable和getmetatable函數(shù)會(huì)用到元表中的一個(gè)字段,用于保護(hù)元表,該字段是__metatable。當(dāng)我們想要保護(hù)集合的元表,是用戶既不能看也不能修改集合的元表,那么就需要使用__metatable字段了;當(dāng)設(shè)置了該字段時(shí),getmetatable就會(huì)返回這個(gè)字段的值,而setmetatable則會(huì)引發(fā)一個(gè)錯(cuò)誤;如以下演示代碼:

復(fù)制代碼 代碼如下:

function Set.new(l)
    local set = {}
     setmetatable(set, mt)
    for _, v in pairs(l) do set[v] = true end
     mt.__metatable = "You cannot get the metatable" -- 設(shè)置完我的元表以后,不讓其他人再設(shè)置
     return set
end
 
local tb = Set.new({1, 2})
print(tb)
 
print(getmetatable(tb))
setmetatable(tb, {})

上述代碼就會(huì)打印以下內(nèi)容:

復(fù)制代碼 代碼如下:

{1, 2}
You cannot get the metatable
lua: test.lua:56: cannot change a protected metatable

__index元方法

是否還記得當(dāng)我們?cè)L問一個(gè)table中不存在的字段時(shí),會(huì)返回什么值?默認(rèn)情況下,當(dāng)我們?cè)L問一個(gè)table中不存在的字段時(shí),得到的結(jié)果是nil。但是這種狀況很容易被改變;Lua是按照以下的步驟決定是返回nil還是其它值得:

1.當(dāng)訪問一個(gè)table的字段時(shí),如果table有這個(gè)字段,則直接返回對(duì)應(yīng)的值;
2.當(dāng)table沒有這個(gè)字段,則會(huì)促使解釋器去查找一個(gè)叫__index的元方法,接下來就就會(huì)調(diào)用對(duì)應(yīng)的元方法,返回元方法返回的值;
3.如果沒有這個(gè)元方法,那么就返回nil結(jié)果。

下面通過一個(gè)實(shí)際的例子來說明__index的使用。假設(shè)要?jiǎng)?chuàng)建一些描述窗口,每個(gè)table中都必須描述一些窗口參數(shù),例如顏色,位置和大小等,這些參數(shù)都是有默認(rèn)值得,因此,我們?cè)趧?chuàng)建窗口對(duì)象時(shí)可以指定那些不同于默認(rèn)值得參數(shù)。

復(fù)制代碼 代碼如下:

Windows = {} -- 創(chuàng)建一個(gè)命名空間
 
-- 創(chuàng)建默認(rèn)值表
Windows.default = {x = 0, y = 0, width = 100, height = 100, color = {r = 255, g = 255, b = 255}}
 
Windows.mt = {} -- 創(chuàng)建元表
 
-- 聲明構(gòu)造函數(shù)
function Windows.new(o)
     setmetatable(o, Windows.mt)
     return o
end
 
-- 定義__index元方法
Windows.mt.__index = function (table, key)
     return Windows.default[key]
end
 
local win = Windows.new({x = 10, y = 10})
print(win.x)               -- >10 訪問自身已經(jīng)擁有的值
print(win.width)          -- >100 訪問default表中的值
print(win.color.r)          -- >255 訪問default表中的值

根據(jù)上面代碼的輸出,結(jié)合上面說的那三步,我們?cè)賮砜纯?,print(win.x)時(shí),由于win變量本身就擁有x字段,所以就直接打印了其自身?yè)碛械淖侄蔚闹?;print(win.width),由于win變量本身沒有width字段,那么就去查找是否擁有元表,元表中是否有__index對(duì)應(yīng)的元方法,由于存在__index元方法,返回了default表中的width字段的值,print(win.color.r)也是同樣的道理。

在實(shí)際編程中,__index元方法不必一定是一個(gè)函數(shù),它還可以是一個(gè)table。當(dāng)它是一個(gè)函數(shù)時(shí),Lua以table和不存在key作為參數(shù)來調(diào)用該函數(shù),這就和上面的代碼一樣;當(dāng)它是一個(gè)table時(shí),Lua就以相同的方式來重新訪問這個(gè)table,所以上面的代碼也可以是這樣的:

復(fù)制代碼 代碼如下:

-- 定義__index元方法
Windows.mt.__index = Windows.default

__newindex元方法

__newindex元方法與__index類似,__newindex用于更新table中的數(shù)據(jù),而__index用于查詢table中的數(shù)據(jù)。當(dāng)對(duì)一個(gè)table中不存在的索引賦值時(shí),在Lua中是按照以下步驟進(jìn)行的:

1.Lua解釋器先判斷這個(gè)table是否有元表;
2.如果有了元表,就查找元表中是否有__newindex元方法;如果沒有元表,就直接添加這個(gè)索引,然后對(duì)應(yīng)的賦值;
3.如果有這個(gè)__newindex元方法,Lua解釋器就執(zhí)行它,而不是執(zhí)行賦值;
4.如果這個(gè)__newindex對(duì)應(yīng)的不是一個(gè)函數(shù),而是一個(gè)table時(shí),Lua解釋器就在這個(gè)table中執(zhí)行賦值,而不是對(duì)原來的table。

那么這里就出現(xiàn)了一個(gè)問題,看以下代碼:

復(fù)制代碼 代碼如下:

local tb1 = {}
local tb2 = {}
 
tb1.__newindex = tb2
tb2.__newindex = tb1
 
setmetatable(tb1, tb2)
setmetatable(tb2, tb1)
 
tb1.x = 10

發(fā)現(xiàn)什么問題了么?是不是循環(huán)了,在Lua解釋器中,對(duì)這個(gè)問題,就會(huì)彈出錯(cuò)誤消息,錯(cuò)誤消息如下:

復(fù)制代碼 代碼如下:

loop in settable

丟掉那該死的元表

有的時(shí)候,我們就不想從__index對(duì)應(yīng)的元方法中查詢值,我們也不想更新table時(shí),也不想執(zhí)行__newindex對(duì)應(yīng)的方法,或者_(dá)_newindex對(duì)應(yīng)的table。那怎么辦?在Lua中,當(dāng)我們查詢table中的值,或者更新table中的值時(shí),不想理那該死的元表,我們可以使用rawget函數(shù),調(diào)用rawget(tb, i)就是對(duì)table tb進(jìn)行了一次“原始的(raw)”訪問,也就是一次不考慮元表的簡(jiǎn)單訪問;你可能會(huì)想,一次原始的訪問,沒有訪問__index對(duì)應(yīng)的元方法,可能有性能的提升,其實(shí)一次原始訪問并不會(huì)加速代碼執(zhí)行的速度。對(duì)于__newindex元方法,可以調(diào)用rawset(t, k, v)函數(shù),它可以不涉及任何元方法而直接設(shè)置table t中與key k相關(guān)聯(lián)的value v。

總結(jié)

這篇博文具體的總結(jié)了Lua中的元表和元方法,可以說Lua中的元表和元方法是很多內(nèi)容的基礎(chǔ),所以我在這里總結(jié)的很詳細(xì),并結(jié)合了很多代碼。如果你有幸看到了這篇文章,希望你也花點(diǎn)時(shí)間認(rèn)真的讀一讀,想要理解Lua,玩轉(zhuǎn)Lua,當(dāng)然了,不能只是會(huì)一些語(yǔ)法,掌握元表和元方法是必不可少的。最后,也希望這篇文章對(duì)大家有用。下一篇博文,我會(huì)結(jié)合__index和__newindex說一些實(shí)例代碼。

您可能感興趣的文章:
  • Lua教程(九):元表與元方法詳解
  • Lua中的元表(metatable)、元方法(metamethod)詳解
  • 舉例說明Lua中元表和元方法的使用

標(biāo)簽:江西 黑龍江 張掖 延邊 新余 嘉峪關(guān) 宜賓 武漢

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中的元表與元方法學(xué)習(xí)總結(jié)》,本文關(guān)鍵詞  Lua,中的,元表,與,元,方法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua中的元表與元方法學(xué)習(xí)總結(jié)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Lua中的元表與元方法學(xué)習(xí)總結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    gogo高清在线播放免费| h视频在线观看免费网站| 中文字幕天天干| 精品第一国产综合精品aⅴ| 欧美色欧美亚洲另类二区精品| 亚洲精品电影网在线观看| 欧美夫妻性视频| 天天干在线影院| 亚洲电影欧美电影有声小说| 波多野结衣办公室双飞| 伊人网在线视频观看| 成人性爱视频在线观看| 亚洲国产精品字幕| 日韩美女天天操| 99精品欧美一区二区三区| yw.尤物在线精品视频| 色狮一区二区三区四区视频| 在线日韩一区| 国产一级在线观看www色| 亚洲精蜜桃久在线| 99在线精品免费视频九九视| 91精品视频播放| 99精品视频免费版的特色功能| 69堂精品视频在线播放| 久久福利影视| 91精品久久久久久久久久| 欧美伦理视频网站| 国产成人精品亚洲777人妖| 欧美成人一区二区三区四区| 草莓视频末满18勿| 国产99精品国产| 欧美毛片免费观看| 粗暴蹂躏中文一区二区三区| 任我爽在线视频| 欧美一级淫片videoshd| 蜜桃视频www网站在线观看| 噜噜噜噜噜久久久久久91| 天堂一区二区三区| 中文字幕精品www乱入免费视频| 免费视频网站在线观看入口| 日本五十路在线| 日韩国产精品久久久久久亚洲| 嫩草影院国产精品| 欧美成人精品欧美一级乱黄| 美女尤物国产一区| 本道综合精品| 亚洲精品一区二区三区香蕉| 91午夜在线播放| 国产精品国产自产拍高清av| 欧美激情亚洲天堂| 日本韩国欧美在线观看| 午夜精品成人在线| 99色在线视频| 国产www.大片在线| 日韩精品在线免费观看视频| 成a人片在线观看www视频| 一区二区三区精品在线观看| 欧美日本在线| 波多野结衣中文字幕久久| 国产精品美女久久久久久久网站| 中文字幕中文字幕中文字幕亚洲无线| 中文字幕一区日韩电影| 最新天堂网www| 137大胆人体在线观看| 无码人妻黑人中文字幕| 日韩av成人| 天海翼视频在线观看| 超碰免费97在线观看| 天堂中文av| 日韩伦理av| 久久精品99久久无色码中文字幕| 日韩专区一卡二卡| 日韩少妇裸体做爰视频| 99久久精品免费视频| 国产日本精品视频| 国产欧美在线| 日本青青草视频| 日韩av色在线| 一区二区在线看| 日韩视频第一页| 国产黑丝在线一区二区三区| 国产成人在线色| 《视频一区视频二区| 免费看污久久久| 26uuu日韩精品一区二区| 亚洲精品无码专区| 欧美人与物videos另类| 久久香蕉精品| 国产精品久久久久久久久免费| 国产农村妇女aaaaa视频| 亚洲青青久久| 久久精品国产亚洲一区二区| 午夜电影久久久| 国产三级三级三级看三级| 国产欧美日韩中文久久| 成人高清视频在线| 日韩综合av| 天天爱天天色| 国产69精品久久久久按摩| 国产成人无码av在线播放dvd| 波多野结衣亚洲一区二区| 黄色成人精品网站| 日韩伦人妻无码| 日韩你懂的电影在线观看| 在线观看黄色av网站| 免费看成年视频网页| 精品影院一区二区久久久| 99热播精品免费| 最新版sss视频在线| 国产精品国色综合久久| 激情偷拍久久| 欧美日韩伦理一区二区| 日韩av在线中文字幕| 国产在线观看91精品一区| 欧美乱强性伦xxxxx| 五月激情久久| 天堂视频中文在线| 一个人看的www片免费高清视频| 亚洲xxxxx性| 91欧美精品| 国产xxxx振车| 亚洲色图偷拍自拍| 中文字幕亚洲综合久久菠萝蜜| 狠狠干狠狠搞| 91国内精品野花午夜精品| 亚洲国产精品影视| 欧美va天堂va视频va在线| 欧美一级在线看| 新版中文在线官网| 亚洲人成网站77777在线观看| 久久久久久久国产| 东方欧美亚洲色图在线| 小嫩嫩12欧美| 999久久久免费精品国产牛牛| 欧美激情图片区| 深夜福利小视频| 国产精品美女一区二区在线观看| 久久国产精品72免费观看| 青青草视频在线免费观看| 久久国产精品-国产精品| 宅男噜噜噜66国产日韩在线观看| 欧美a级片网站| 超免费在线视频| 91精品国产综合久久精品性色| 色综合久久中文字幕| 国产剧情av麻豆香蕉精品| 一区二区三区成人在线视频| 国产毛片视频| 日本视频一二三区中文字幕| 亚洲欧洲成人av每日更新| 国产xxxx视频| 国产一区二区三区探花| 无人码人妻一区二区三区免费| 亚洲黄色性网站| 久久久午夜精品| 天天操精品视频| 亚洲v精品v日韩v欧美v专区| 在线看黄色的网站| av高清一区二区| av永久不卡| 欧美bbbbxxxx| 久久三级福利| 日本丰满www色| 国产精品入口芒果| 91天天综合| 亚洲成人教育av| 美女三级黄色片| 亚洲三级免费观看| 欧美日韩亚洲国产精品| 天天综合天天综合色| 亚洲综合极品香蕉久久网| 日韩欧美在线影院| 大地资源网3页在线观看| 日本亚洲欧美成人| 国产精品美女久久久久久不卡| 欧美午夜视频一区二区| av在线不卡免费看| 91精品国产综合久久国产大片| 99久久久精品免费观看国产蜜| 成人免费毛片aaaaa**| 欧美日韩一二| 日韩欧美一区二区三区四区| 日本一本a高清免费不卡| 成人黄视频免费| 国产91av视频在线观看| 久久女同互慰一区二区三区| 黄色一级免费| 中文字幕亚洲日本| 北条麻妃国产九九九精品小说| 久久av红桃一区二区小说| 4438亚洲最大| 精品人妻伦一二三区久久| 国产成人一区二区三区电影| 黄色网址入口| 亚洲黄色小说视频| 特级全黄一级毛片| 亚洲啊啊啊啊啊| caoporn视频在线| 无码黑人精品一区二区| 欧美jizz18性欧美| 色佬视频在线观看| 久久久综合激的五月天| 天天操夜夜操天天射| 国产福利一区二区在线精品| 国产精品日韩欧美一区二区| 中文字幕一区二区精品区| 成人在线视频你懂的| h网站免费在线观看| 亚洲乱码国产乱码精品精98午夜| 在线观看不卡的av| а天堂中文最新一区二区三区| 性金发美女69hd大尺寸| 成人白浆超碰人人人人| 欧美系列一区| 在线观看黄网址| 欧美日一区二区在线观看| 久久久久免费视频| 青青青国产在线观看| 男人添女荫道口女人有什么感觉| 97视频热人人精品| mm131丰满少妇人体欣赏图| 日韩精品一二三区| 国产精品久久久久久久久久三级| 日韩免费在线| 91成品人片a无限观看| 免费福利在线| 免播放器亚洲| 成人小视频在线看| 国产精品久久久久久久久粉嫩av| 午夜不卡av免费| 97久久精品国产| 国产成人h网站| 无码一区二区精品| 电影在线高清| 亚洲日本高清| 在线中文资源天堂| 先锋影音av中文字幕| 91精品一区二区三区在线观看| 午夜福利三级理论电影| 日本不卡影院| 91偷拍一区二区三区精品| 久草在线在线视频| 日韩精品在在线一区二区中文| 国产中文在线播放| 日本在线视频一区| 国产中文字幕网| 日韩一卡二卡在线观看| 91精品久久久久久久蜜月| 亚洲国内精品在线| 精品国产欧美一区二区三区成人| 欧美日韩少妇| 夜夜骑夜夜操| 一本色道久久综合亚洲精品小说| 3d动漫精品啪啪一区二区竹菊| 高清免费日韩| 久久久久国产精品夜夜夜夜夜| 午夜视频在线观看一区二区三区| 超碰在线免费公开| 韩国精品视频在线观看| 色综合色综合网色综合| 日本久久网站| 欧美与黑人午夜性猛交久久久| 亚洲欧美国产精品va在线观看| 肉色超薄丝袜脚交一区二区| 亚洲精品中文在线影院| 日本韩国欧美一区二区三区| 伊人久久亚洲综合| 一本一本久久a久久综合精品蜜桃| 国产亚洲精品7777| 色欲综合视频天天天| 国产wwww| 天堂av在线资源| 国精品人伦一区二区三区蜜桃| 亚洲美女自拍视频| 国产精品免费无遮挡无码永久视频| 亚洲一区二区久久久久久| 色综合婷婷久久| 久久亚洲专区| 日韩欧美a级成人黄色| 91成人免费视频| 国产日韩欧美麻豆| jizzjizz国产| 国产精品成人免费视频| av中文字幕亚洲| 亚洲av熟女国产一区二区性色| 欧美伦理91i| 黑人与亚洲人色ⅹvideos| 亚洲国产精品日韩专区av有中文| 欧美激情成人在线| 国产成人精品电影久久久| 国产日本欧美在线观看| 国产精品视频一区二区高潮| 人人妻人人藻人人爽欧美一区| av手机在线播放| 你懂的网站在线观看网址| 欧美日产国产成人免费图片| 特级xxxxx欧美| 亚洲欧美国产制服动漫| 欧美aa国产视频| 国产伦一区二区| 国产精品白丝jk白祙喷水网站| 日韩在线免费视频观看| 久久久国产精品| www.色呦呦| 不卡的在线视频| 国产成人无码av在线播放dvd| 亚洲女同女同女同女同女同69| 91丨九色丨国产丨porny| 四虎4hu影库永久地址| 欧美日本不卡视频| 国产男女猛烈无遮挡91| 成人福利在线看| 黄页视频在线91| 九七影院理论片| 久久久久狠狠高潮亚洲精品| 久久资源中文字幕| 亚洲视频在线免费看| 中文字幕剧情在线观看一区| h片在线免费| 亚洲精品国产精品乱码在线观看| 欧美视频一区二区| 福利一区二区三区视频在线观看| 日韩子在线观看| 国产精品-区区久久久狼| 国产精品视频一区二区三区不卡| 亚洲国产欧美日韩在线| 天堂网avav| 91人妻一区二区三区|