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

主頁 > 知識庫 > Lua中的模塊(module)和包(package)詳解

Lua中的模塊(module)和包(package)詳解

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

前言

從Lua5.1版本開始,就對模塊和包添加了新的支持,可是使用require和module來定義和使用模塊和包。require用于使用模塊,module用于創(chuàng)建模塊。簡單的說,一個模塊就是一個程序庫,可以通過require來加載。然后便得到了一個全局變量,表示一個table。這個table就像是一個命名空間,其內(nèi)容就是模塊中導(dǎo)出的所有東西,比如函數(shù)和常量,一個符合規(guī)范的模塊還應(yīng)使require返回這個table?,F(xiàn)在就來具體的總結(jié)一下require和module這兩個函數(shù)。

require函數(shù)

Lua提供了一個名為require的函數(shù)用來加載模塊。要加載一個模塊,只需要簡單地調(diào)用require “模塊名>”就可以了。這個調(diào)用會返回一個由模塊函數(shù)組成的table,并且還會定義一個包含該table的全局變量。但是,這些行為都是由模塊完成的,而非require。所以,有些模塊會選擇返回其它值,或者具有其它的效果。那么require到底是如何加載模塊的呢?

首先,要加載一個模塊,就必須的知道這個模塊在哪里。知道了這個模塊在哪里以后,才能進(jìn)行正確的加載。當(dāng)我們寫下require “mod”這樣的代碼以后,Lua是如何找這個mod的呢?這里面就有說道了,我這里就詳細(xì)的說一說。

在搜索一個文件時,在windows上,很多都是根據(jù)windows的環(huán)境變量path來搜索,而require所使用的路徑與傳統(tǒng)的路徑不同,require采用的路徑是一連串的模式,其中每項(xiàng)都是一種將模塊名轉(zhuǎn)換為文件名的方式。require會用模塊名來替換每個“?”,然后根據(jù)替換的結(jié)果來檢查是否存在這樣一個文件,如果不存在,就會嘗試下一項(xiàng)。路徑中的每一項(xiàng)都是以分號隔開,比如路徑為以下字符串:

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

?;?.lua;c:\windows\&;;/usr/local/lua/?/?.lua

那么,當(dāng)我們r(jià)equire “mod”時,就會嘗試著打開以下文件:

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

mod
mod.lua
c:\windows\mod
/usr/local/lua/mod/mod.lua

可以看到,require函數(shù)只處理了分號和問好,其它的都是由路徑自己定義的。在實(shí)際編程中,require用于搜索的Lua文件的路徑存放在變量package.path中,在我的電腦上,print(package.path)會輸出以下內(nèi)容:

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

;.\&;.lua;D:\Lua\5.1\lua\&;.lua;D:\Lua\5.1\lua\&;\init.lua;D:\Lua\5.1\&;.lua;D:\Lua\5.1\&;\init.lua;D:\Lua\5.1\lua\&;.luac

如果require無法找到與模塊名相符的Lua文件,那Lua就會開始找C程序庫;這個的搜索地址為package.cpath對應(yīng)的地址,在我的電腦上,print(package.cpath)會輸出以下值:

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

.\&;.dll;.\&;51.dll;D:\Lua\5.1\&;.dll;D:\Lua\5.1\&;51.dll;D:\Lua\5.1\clibs\&;.dll;D:\Lua\5.1\clibs\&;51.dll;D:\Lua\5.1\loadall.dll;D:\Lua\5.1\clibs\loadall.dll

當(dāng)找到了這個文件以后,如果這個文件是一個Lua文件,它就通過loadfile來加載該文件;如果找到的是一個C程序庫,就通過loadlib來加載。loadfile和loadlib都只是加載了代碼,并沒有運(yùn)行它們,為了運(yùn)行代碼,require會以模塊名作為參數(shù)來調(diào)用這些代碼。如果lua文件和C程序庫都找不到,怎么辦?我們試一下,隨便require一個東西,比如:

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

require "jellythink"
lua: test.lua:1: module 'jellythink' not found:
     no field package.preload['jellythink']
     no file '.\jellythink.lua'
     no file 'D:\Lua\5.1\lua\jellythink.lua'
     no file 'D:\Lua\5.1\lua\jellythink\init.lua'
     no file 'D:\Lua\5.1\jellythink.lua'
     no file 'D:\Lua\5.1\jellythink\init.lua'
     no file 'D:\Lua\5.1\lua\jellythink.luac'
     no file '.\jellythink.dll'
     no file '.\jellythink51.dll'
     no file 'D:\Lua\5.1\jellythink.dll'
     no file 'D:\Lua\5.1\jellythink51.dll'
     no file 'D:\Lua\5.1\clibs\jellythink.dll'
     no file 'D:\Lua\5.1\clibs\jellythink51.dll'
     no file 'D:\Lua\5.1\loadall.dll'
     no file 'D:\Lua\5.1\clibs\loadall.dll'

是的,會報(bào)錯的。以上就是require的一般工作流程。

奇淫技巧

可以看到,上面總結(jié)的都是通過模塊的名稱來使用它們。但有的時候需要將一個模塊改名,以避免名稱沖突。比如有這樣的場景,在測試中需要加載同一模塊的不同版本,而獲得版本之間的性能區(qū)別。那么我們?nèi)绾渭虞d同一模塊的不同版本呢?對于一個Lua文件來說,我們可以很輕易的改掉它的名稱,但是對于一個C程序庫來說,我們是沒有辦法編輯其中的luaopen_*函數(shù)的名稱的。為了這種重命名的需求,require用到了一個小的技巧:如果一個模塊名中包含了連字符,require就會用連字符后的內(nèi)容來創(chuàng)建luaopen_*函數(shù)名。比如:如果一個模塊的名稱為a-b,require就會認(rèn)為它的open函數(shù)名為luaopen_b,并不是luaopen_a-b?,F(xiàn)在好了,對于上面提出的不同版本進(jìn)行測試的需求,就可以迎刃而解了。

寫一個我們自己的模塊

在Lua中創(chuàng)建一個模塊最簡單的方法是:創(chuàng)建一個table,并將所有需要導(dǎo)出的函數(shù)放入其中,最后返回這個table就可以了。相當(dāng)于將導(dǎo)出的函數(shù)作為table的一個字段,在Lua中函數(shù)是第一類值,提供了天然的優(yōu)勢。來寫一個我們自己的模塊,代碼如下:

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

complex = {}    -- 全局的變量,模塊名稱
 
function complex.new(r, i) return {r = r, i = i} end
 
-- 定義一個常量i
complex.i = complex.new(0, 1)
 
function complex.add(c1, c2)
    return complex.new(c1.r + c2.r, c1.i + c2.i)
end
 
function complex.sub(c1, c2)
    return complex.new(c1.r - c2.r, c1.i - c2.i)
end
 
return complex  -- 返回模塊的table

上面就是一個最簡單的模塊。在編寫代碼的過程中,會發(fā)現(xiàn)必須顯式地將模塊名放到每個函數(shù)定義中;而且,一個函數(shù)在調(diào)用同一個模塊中的另一個函數(shù)時,必須限定被調(diào)用函數(shù)的名稱,然而我們可以稍作變通,在模塊中定義一個局部的table類型的變量,通過這個局部的變量來定義和調(diào)用模塊內(nèi)的函數(shù),然后將這個局部名稱賦予模塊的最終的名稱,代碼如下:

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

local M = {}    -- 局部的變量
complex = M     -- 將這個局部變量最終賦值給模塊名
 
function M.new(r, i) return {r = r, i = i} end
 
-- 定義一個常量i
M.i = M.new(0, 1)
 
function M.add(c1, c2)
    return M.new(c1.r + c2.r, c1.i + c2.i)
end
 
function M.sub(c1, c2)
    return M.new(c1.r - c2.r, c1.i - c2.i)
end
 
return complex  -- 返回模塊的table

這樣,我們在模塊內(nèi)部其實(shí)使用的是一個局部的變量。這樣看起來比較簡單粗暴,但是每個函數(shù)仍需要一個前綴。實(shí)際上,我們可以完全避免寫模塊名,因?yàn)閞equire會將模塊名作為參數(shù)傳給模塊。讓我們來做個試驗(yàn):

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

local moduleName = ...
 
-- 打印參數(shù)
for i = 1, select('#', ...) do
     print(select(i, ...))
end
 
local M = {}    -- 局部的變量
_G[moduleName] = M     -- 將這個局部變量最終賦值給模塊名
complex = M
 
function M.new(r, i) return {r = r, i = i} end
 
-- 定義一個常量i
M.i = M.new(0, 1)
 
function M.add(c1, c2)
    return M.new(c1.r + c2.r, c1.i + c2.i)
end
 
function M.sub(c1, c2)
    return M.new(c1.r - c2.r, c1.i - c2.i)
end
 
return complex  -- 返回模塊的table

將上述代碼保存為test1.lua。再寫一個文件,代碼如下:

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

require "test"
 
c1 = test.new(0, 1)
c2 = test.new(1, 2)
 
ret = test.add(c1, c2)
print(ret.r, ret.i)

將上述代碼保存為test2.lua

將上述代碼放在同一個文件夾下,運(yùn)行test2.lua文件,打印結(jié)果如下:

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

test1
1     3

(PS:如果對代碼中的三個點(diǎn)(…)不熟悉的同學(xué),請參考:《Lua中的函數(shù)》一文)經(jīng)過這樣的修改,我們就可以完全不用在模塊中定義模塊名稱,如果需要重命名一個模塊,只需要重命名定義它的文件就可以了。

細(xì)心的同學(xué)可能注意到了模塊結(jié)尾處的return語句,這樣的一個return語句,在定義模塊時,是非常容易漏寫的,怎么辦?如果將所有與模塊相關(guān)的設(shè)置任務(wù)都集中在模塊開頭,就會更好了。消除return語句的一種方法是,將模塊table直接賦值給package.loaded,代碼如下:

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

local moduleName = ...
 
local M = {}    -- 局部的變量
_G[moduleName] = M     -- 將這個局部變量最終賦值給模塊名
 
package.loaded[moduleName] = M
-- 后續(xù)代碼省略

示例代碼下載:點(diǎn)擊這里下載

package.loaded是什么?

require會將返回值存儲到table package.loaded中;如果加載器沒有返回值,require就會返回table package.loaded中的值??梢钥吹剑覀兩厦娴拇a中,模塊沒有返回值,而是直接將模塊名賦值給table package.loaded了。這說明什么,package.loaded這個table中保存了已經(jīng)加載的所有模塊?,F(xiàn)在我們就可以看看require到底是如何加載的呢?

1.先判斷package.loaded這個table中有沒有對應(yīng)模塊的信息;
2.如果有,就直接返回對應(yīng)的模塊,不再進(jìn)行第二次加載;
3.如果沒有,就加載,返回加載后的模塊。

再說“環(huán)境”

大家可能注意到了,當(dāng)我訪問同一個模塊中的其它函數(shù)時,都需要限定名稱,就比如上面代碼中的M。當(dāng)我把模塊內(nèi)部的一個local函數(shù)由私有改變成公有以后,相應(yīng)的調(diào)用local函數(shù)的地方都需要修改,加上限定名稱。怎么辦?總不能每次都修改代碼吧。如何一次搞定?是否還記得《Lua中的環(huán)境概念》這篇博文,里面講到的環(huán)境概念在這里就能派上用場。

我們可以讓模塊的主程序塊有一個獨(dú)占的環(huán)境,這樣不僅它的所有函數(shù)都可共享這個table,而且它的所有全局變量也都記錄在這個table中,還可以將所有公有函數(shù)聲明為全局變量,這樣它們就都自動地記錄在一個獨(dú)立的table中。而模塊所要做的就是將這個table賦予模塊名和package.loaded。比如以下代碼就可以完成:

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

local moduleName = ...
 
local M = {}    -- 局部的變量
_G[moduleName] = M     -- 將這個局部變量最終賦值給模塊名
 
package.loaded[moduleName] = M
setfenv(1, M)

這之后,當(dāng)我們寫下下面的代碼:

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

function add(c1, c2)
    return new(c1.r + c2.r, c1.i + c2.i)
end

它其實(shí)是和下面的代碼是等價(jià)的:
復(fù)制代碼 代碼如下:

function M.add(c1, c2)
    return M.new(c1.r + c2.r, c1.i + c2.i)
end

當(dāng)我調(diào)用同一個模塊中的函數(shù)new時,也不用指定M了。這樣就可以讓我們在寫自己的模塊時,省去了前綴;還有其它好處,你可以自己想想。但是,當(dāng)我們調(diào)用setfenv之后,將一個空table M作為環(huán)境后,就無法訪問前一個環(huán)境中全局變量了。這該如何是好?現(xiàn)在提供幾種方法。

方法一:

最簡單的方法就是在《Lua中的環(huán)境概念》一文中說的那樣,使用元表,設(shè)置__index,模擬繼承來實(shí)現(xiàn)。代碼如下:

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

local moduleName = ...
 
local M = {}    -- 局部的變量
_G[moduleName] = M     -- 將這個局部變量最終賦值給模塊名
 
package.loaded[moduleName] = M
 
setmetatable(M, {__index = _G})
setfenv(1, M)

上述代碼很簡單,原理在之前的博文中都詳細(xì)的講過了,這里不再啰嗦了。由于需要設(shè)置元表,所有會有一定的開銷,但是可以忽略的。

方法二:

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

local moduleName = ...
 
local M = {}    -- 局部的變量
_G[moduleName] = M     -- 將這個局部變量最終賦值給模塊名
 
package.loaded[moduleName] = M
 
local _G = _G -- 保存了全局的環(huán)境變量
setfenv(1, M)

這樣在自己的模塊中保存一個全局的環(huán)境變量,當(dāng)我們訪問前一個環(huán)境中的變量時,就需要添加前綴_G,貌似有點(diǎn)小麻煩。但是,由于沒有涉及到元方法,這種方法會比方法一略快。

方法三:

這種方法是最正規(guī)的方法,就是將那些需要用到的函數(shù)或模塊聲明為局部變量,看以下代碼:

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

local moduleName = ...
 
local M = {}    -- 局部的變量
_G[moduleName] = M     -- 將這個局部變量最終賦值給模塊名
 
package.loaded[moduleName] = M
 
local sqrt = math.sqrt -- 在我們自己的模塊中需要用到math.sqrt這個函數(shù),所以就先保存下來
local io = io -- 需要用到io庫,也保存下來
setfenv(1, M) -- 設(shè)置完成以后,就不能再使用_G table中的內(nèi)容了

方法三需要做的工作是最多的,而且也是最麻煩的,但是性能是最好的。怎么用,你自己看著辦吧。

module函數(shù)

大家可能也注意到了,在定義一個模塊時,前面的幾句代碼都是一樣的,就分為以下幾步:

1.從require傳入的參數(shù)中獲取模塊名;
2.建立一個空table;
3.在全局環(huán)境_G中添加模塊名對應(yīng)的字段,將空table賦值給這個字段;
4.在已經(jīng)加載table中設(shè)置該模塊;
5.設(shè)置環(huán)境變量。

就是這幾步,在每一個模塊的定義之前都需要加上,是不是有點(diǎn)麻煩,在Lua5.1中提供了一個新函數(shù)module,它包括了以上這些步驟完成的功能。在編寫一個模塊時,可以直接用以下代碼來取代前面的設(shè)置代碼:

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

module(...)

就上面這一小句代碼,它會創(chuàng)建一個新的table,并將其賦予給模塊名對應(yīng)的全局字段和loaded table,最后還會將這個table設(shè)為主程序塊的環(huán)境。默認(rèn)的情況下,module不提供外部的訪問的,也就是說,你無法訪問前一個環(huán)境了,在再說“環(huán)境”一節(jié),我專門說了三種解決方案。在使用module時是這樣解決的:
復(fù)制代碼 代碼如下:

module(..., package.seeall)

這句話的功能就好比之前的功能再加上了setmetatable(M, {__index = _G})。有了這一句代碼,基本上就可以說萬事不愁了。

子模塊與包

Lua支持具有層級性的模塊名,可以用一個點(diǎn)來分隔名稱中的層級。假設(shè)一個模塊名為mod.sub,那么它就是mod的一個子模塊。因此,可以認(rèn)為模塊mod.sub會將其所有值都定義在table mod.sub中,也就是一個存儲在table mod中,且key為sub的table。就好比下述的定義:

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

local mod = {sub = {}}

當(dāng)require一個模塊mod.sub時,require會用原始的模塊名“mod.sub”作為key來查詢table package.loaded和package.preload,其中,模塊名中的點(diǎn)在搜索時沒有任何意義。但是,當(dāng)搜索一個定義子模塊的文件時,require會將點(diǎn)轉(zhuǎn)換成另一個字符,通常就是系統(tǒng)的目錄分隔符,轉(zhuǎn)換之后require就像搜索其他名稱一樣來搜索這個名稱。比如路徑為以下字符串:
復(fù)制代碼 代碼如下:

?;?.lua;c:\windows\&;;/usr/local/lua/?/?.lua

那么,當(dāng)我們r(jià)equire “mod.sub”時,就會嘗試著打開以下文件:

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

mod\sub
mod\sub.lua
c:\windows\mod\sub
/usr/local/lua/mod/mod/sub.lua

通過這樣的加載策略,就可以將一個包中的所有模塊組織到一個目錄中。像這些小的功能,都會組合成很多的奇淫技巧,雖然在實(shí)際項(xiàng)目中用的不會很多,但是玩起來還是很有意思的。

總結(jié)

這一篇文章主要總結(jié)了Lua中的兩個非常重要的函數(shù)require和module。希望對大家有用。對于今天的開發(fā)來說,什么都講究模塊開發(fā),而這篇文章總結(jié)的就是進(jìn)行模塊開發(fā)時需要使用的兩個重要函數(shù)。大家在日后構(gòu)建自己的模塊時,如果有哪里不懂,哪里不清楚,可以再回過頭來閱讀這篇文章,或者可以直接留言和我交流。我相信,分享與交流使我們更進(jìn)步。

您可能感興趣的文章:
  • Lua教程(十一):模塊與包詳解
  • Lua模塊與包學(xué)習(xí)筆記
  • Lua的函數(shù)環(huán)境、包實(shí)例講解
  • Lua調(diào)用自定義C模塊
  • Lua中使用模塊的一些基礎(chǔ)知識
  • 使用Lua編寫Nginx服務(wù)器的認(rèn)證模塊的方法
  • 在Lua中使用模塊的基礎(chǔ)教程
  • Lua極簡入門指南(六):模塊
  • Lua模塊和模塊載入淺析
  • Lua中的模塊與module函數(shù)詳解
  • 解析Lua中的全局環(huán)境、包、模塊組織結(jié)構(gòu)

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua中的模塊(module)和包(package)詳解》,本文關(guān)鍵詞  Lua,中的,模塊,module,和包,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua中的模塊(module)和包(package)詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Lua中的模塊(module)和包(package)詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    18国产精品| 国产欧美精品一区二区三区| 欧洲免费在线视频| 青青草原国产免费| 亚洲色图影院| 亚洲在线激情| 欧美三级小说| 亚洲成av人片乱码色午夜| 99久久99久久免费精品小说| 精品三级av在线| 一区二区日韩精品| 色就是色欧美色图| 18av在线视频| www.亚洲| 日本不卡一区视频| 欧美亚洲视频在线看网址| 99re这里只有精品首页| 欧美国产欧美亚州国产日韩mv天天看完整| 5g成人永久免费影院| 91大神在线播放精品| 99re在线精品| 春暖花开亚洲| 国产精品对白| 加勒比日本影视| 五月激情综合色| 加勒比一区二区三区在线| 国产精品极品美女在线观看免费| 成人福利网站| 国产精品你懂的在线观看| 人妻无码一区二区三区四区| 国产综合色一区二区三区| 波多野结衣在线观看一区二区三区| 手机在线免费毛片| 波多野结衣黄色| 视频在线观看免费影院欧美meiju| 在线观看视频99| 中文久久久久久| 人人妻人人澡人人爽精品日本| 久久99精品久久久久久欧洲站| 欧美日韩中文一区| 欧美风情在线视频| 好吊色视频一区二区三区| 成人欧美色图| 国产成人啪免费观看软件| 国产精品日韩一区| 成人mm视频在线观看| 日韩中文字幕在线免费观看| 国产精品久久久久久婷婷天堂| 蜜桃av噜噜一区二区三区小说| 精品久久久久一区二区三区| 日韩精品导航| 亚洲色图激情小说| 在线满18网站观看视频| 肉色丝袜一区二区| 国产不卡av在线| 亚洲欧美日韩精品永久在线| 欧美久久免费观看| 网友自拍亚洲| 99精品久久久久久| 妖精视频成人观看www| 欧美一区二粉嫩精品国产一线天| 久久日.com| 亚洲伊人伊色伊影伊综合网| 女人扒开腿免费视频app| а√最新版天堂中文在线| 一区二区三区我不卡| 日韩精品中文字幕吗一区二区| 亚洲a∨一区二区三区| 精品国产三区在线| 久播影院第一理论片| 国产精品免费电影| 日本午夜大片a在线观看| 亚洲综合五月天婷婷丁香| 国产精彩视频一区二区| 欧美精品18videosex性欧美| 日本一区二区在线视频| 国产精品二区一区二区aⅴ污介绍| 国产主播福利| 91久久久免费一区二区| 久久精品91久久久久久再现| 国产黄色大片在线观看| 一区二区三区在线观看国产| 久久精品国产亚洲高清剧情介绍| 伊人av在线| 深夜福利免费在线观看| 青春草视频在线观看| a级片在线观看免费| 中文字幕在线播| 精品国产免费一区二区三区| theav精尽人亡av| 欧美系列日韩一区| 超碰免费97在线观看| igao视频网在线视频| 毛片av免费观看| 国产一区二区三区久久悠悠色av| 亚洲自拍第二页| 久久av在线看| 99re热这里只有精品视频| 精品国产午夜福利在线观看| 成人男女网免费| 韩日欧美一区二区三区| 亚洲级视频在线观看免费1级| 成年人在线免费观看| 国产日韩v精品一区二区| 国产真人做爰毛片视频直播| 亚洲xxx自由成熟| 丝袜美腿一区二区三区动态图| 中文字幕在线观看的网站| 亚洲天堂一级片| 国产视频福利在线| 久久老司机精品视频| 国产另类第一区| 四虎免费播放| 999香蕉视频| a级高清视频欧美日韩| 一区av在线播放| 亚洲永久免费精品| 3d蒂法精品啪啪一区二区免费| 九九视频直播综合网| 999久久久免费精品国产牛牛| 国产亚洲欧美中文| 国产一级片在线播放| 日本一级理论片在线大全| 日本不卡一区视频| 日韩成人中文字幕| 亚洲男同性恋视频| 欧美日韩精品国产| 国产成人三级视频| 国内免费久久久久久久久久久| 国产亚洲视频在线观看| 国产一区二区三区四区大秀| 777午夜精品电影免费看| www.超碰com| 国产日韩高清一区二区三区在线| 橘梨纱av一区二区三区在线观看| 狠狠操视频网站| 久久av一区| 免费观看h片| 日本中文字幕成人| 国产亚洲欧洲一区高清在线观看| 久热精品免费视频| 影音先锋导航| 国产伦理一区二区| 女人一区二区三区| 久热中文字幕在线观看| 欧美日韩a v| 欧美在线精品一区| 精品日韩欧美一区二区| 4438x成人网最大色成网站| 香蕉久久久久久av成人| 99视频精品全国免费| 国偷自拍第113页| 国产福利一区在线观看| 手机在线免费看毛片| 99久久久精品免费观看国产| 最新av电影| 免费看岛国视频在线观看| 无码人妻aⅴ一区二区三区玉蒲团| 精品一二三四区| 韩国成人一区| 搜成人激情视频| 欧美一区二区美女| 欧美日韩一视频区二区| 国产精品一区二区久久久| 婷婷综合国产| 国产手机视频一区二区| 少妇高潮爽到全身痉挛抽搐| 国产ts一区二区| 国产一级揄自揄精品视频| 哥也色在线视频| 97久久综合区小说区图片区| 99热在线免费观看| 国产精品久久久久aaaa| 蜜桃一级网站.| 最新在线中文字幕| 超碰在线观看免费| 麻豆一区二区在线| 国产精品伦一区二区三级视频| 欧美熟妇另类久久久久久不卡| 国产精品国产av| 亚洲日本丝袜连裤袜办公室| 69av在线播放| 羞羞的视频免费| 2021国产视频| 国产乱码在线观看| 国产xxx69麻豆国语对白| 久久影院午夜论| 国产精品久久久久久模特| 四虎成人永久免费视频| 91欧美日韩在线| 久久亚洲精品国产亚洲老地址| 国产又黄又嫩又滑又白| 精品丝袜一区二区三区| 欧美色图另类图片| 亚洲精品高清视频在线观看| 精品亚洲成a人在线观看| 日韩欧美综合在线| 亚洲成人男人天堂| 日本成人免费在线| 久久久久久久久久久久久久久久久久久| 在线观看视频一区二区| 久久先锋影音av鲁色资源网| 国产免费一区二区三区四区| 青娱乐在线视频观看| 好紧好硬好湿我太爽了| 亚洲综合一二三区| 欧美日韩亚洲国产一区| 午夜免费欧美电影| 色偷偷av男人的天堂| 精品人妻午夜一区二区三区四区| 日韩一级精品视频在线观看| av电影一区二区| 又色又爽又高潮免费视频国产| 国产成人97精品免费看片| 91超碰在线免费| 国产美女在线看| 制服视频三区第一页精品| 久久这里有精品15一区二区三区| 久久综合久久99| 国产成人毛毛毛片| 日韩经典中文字幕一区| 国产在线xxxx| 激情成人在线观看| 久久久久无码国产精品一区李宗瑞| 日韩二区在线观看| 日韩一区亚洲二区| 欧美性猛交xxxx乱大交极品| 久草网站在线观看| 国产精品视频福利| 亚洲人体大胆视频| 日本黄色免费在线| 日韩中文字幕精品视频| 蜜臀视频一区二区三区| 永久久久免费浮力影院| 亚洲精品电影在线观看| 国产乱码精品一区二三区蜜臂| 国产午夜精品一区二区理论影院| 亚洲无码精品一区二区三区| 国产精品18久久久久久首页狼| 亚洲国产欧美日本视频| 久久天天狠狠| 色综合.com| 国产精品无码天天爽视频| 在线观看免费黄色片| 一本色道久久综合狠狠躁篇怎么玩| 欧美精品卡一卡二| 亚洲国产中文字幕久久网| 免费国产羞羞网站美图| 日本精品国语自产拍在线观看| 俄罗斯精品一区二区三区| 麻豆一区一区三区四区| 欧美尺度大的性做爰视频| 秋霞电影网一区二区| 国产精品毛片久久久久久| av影院在线播放| 国产高清免费av在线| 国产成人小视频在线观看| 免费在线观看毛片网站| www.夜色| 国产视频精品免费播放| caoporn97免费视频公开| 人人妻人人澡人人爽精品欧美一区| 国产精品福利小视频| 调教视频免费在线观看| 欧美一区二区三区免费大片| eeuss影院www天堂免费| 国内外成人激情免费视频| 1234区在线观看视频免费| 久久久高清视频| 日本xxx免费| h小视频在线观看网| 国产又色又爽又黄的| 一区二区三区免费在线观看视频| 亚洲成人在线免费| 成人短视频软件网站大全app| 国产一区二区美女诱惑| 亚洲一区二区少妇| 亚洲社区在线| 成人高清视频在线| 免费在线欧美视频| 制服丝袜影音| 97高清免费视频| 88av在线| 欧美美女啪啪| 57pao国产精品一区| 劲爆欧美第一页| 亚洲精品www| 亚洲二区在线视频| 伊是香蕉大人久久| 草莓视频性福宝| 色播视频在线观看| 777sesese| 国产做受高潮69| 黄色直播在线| 日韩精品一区二区三区中文在线| 精品国产一区二区三区香蕉沈先生| 手机在线播放av| 久久爱.com| 91亚洲精品国偷拍自产在线观看| 久久九九99视频| 国产乱码一区| 1024免费在线视频| 男人的天堂avav| 国产婷婷色一区二区在线观看| 国产精品一区二区三区四区色| 亚洲午夜电影网| 午夜av在线免费观看| 国产欧美日韩不卡免费| 日韩中文影院| 久久无码av三级| 波多野吉衣在线视频| 久久久成人精品一区二区三区| 午夜精品国产更新| 国内精品国产成人| 九色精品视频在线观看| 婷婷综合五月| av中文字幕一区二区三区| 狠狠操天天操夜夜操| 四色永久网址| 欧美1区2区| 欧美日韩成人网| 爆乳熟妇一区二区三区霸乳| 手机av免费观看| 狠狠色噜噜狠狠狠狠黑人| 人人澡人人澡人人看| 再深点灬舒服灬太大了少妇| 欧美不卡高清| 免费观看黄网站|