日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁(yè) > 編程 > Ruby > 正文

用實(shí)際代碼演示Ruby的容易被誤解的6個(gè)特性

2020-10-29 19:41:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

簡(jiǎn)介: 假設(shè)您是一名 C++ 開(kāi)發(fā)人員,您需要使用 Ruby 快速執(zhí)行一些原型設(shè)計(jì)。當(dāng)您拿起一本 Ruby 參考書(shū)籍(比如 Pickaxe)或?yàn)g覽 Ruby 網(wǎng)站時(shí),會(huì)看到一些熟悉的構(gòu)造,比如類(lèi)聲明、線程支持和異常處理。正當(dāng)您認(rèn)為自己了解 Ruby 的工作原理之時(shí),您意識(shí)到了,您 Ruby 代碼中的并發(fā)機(jī)制與 Boost 線程工作原理不一樣,catch 和 throw 也與它們看上去的大不相同,而且其他人在其 Ruby 腳本中各處使用了名為 self 的關(guān)鍵詞。歡迎來(lái)到 Ruby 的世界中!

如果您是一名 C++ 程序員且需要在 Ruby 環(huán)境中工作,那么您有一些功課要做。本文討論了 Ruby 新手可能會(huì)誤解的六個(gè) Ruby 特性,特別是當(dāng)他或她來(lái)自一個(gè)類(lèi)似但又不太相同的環(huán)境,比如 C++:

● Ruby 類(lèi)層次結(jié)構(gòu)

● Ruby 中的單例方法

● self 關(guān)鍵詞

● method_missing 方法

● 異常處理

● 線程

 

注意:本文中所有的代碼均進(jìn)行測(cè)試,且基于 Ruby 版本 1.8.7。

 

Ruby 中的類(lèi)層次結(jié)構(gòu)

Ruby 中的類(lèi)層次結(jié)構(gòu)會(huì)很棘手。創(chuàng)建一個(gè) Cat 類(lèi)型的類(lèi)并開(kāi)始探討其層次結(jié)構(gòu)(參見(jiàn) 清單 1)。

清單 1. Ruby 中的隱式類(lèi)層次結(jié)構(gòu)

 

irb(main):092:0> class Catirb(main):093:1> end=> nil irb(main):087:0> c = Cat.new=> #<Cat:0x2bacb68>irb(main):088:0> c.class=> Catirb(main):089:0> c.class.superclass=> Objectirb(main):090:0> c.class.superclass.superclass=> nilirb(main):091:0> c.class.superclass.superclass.superclassNoMethodError: undefined method `superclass' for nil:NilClass  from (irb):91  from :0

Ruby 中的所有對(duì)象(甚至用戶定義的對(duì)象)都是 Object 類(lèi)的后代,這在清單 1 中清晰可見(jiàn)。這與 C++ 是鮮明的對(duì)比。這一點(diǎn)也不像普通數(shù)據(jù)類(lèi)型,例如 C/C++ int 或 double。清單 2 顯示了整數(shù) 1 的類(lèi)層次結(jié)構(gòu)。

清單 2. 整數(shù) 1 的類(lèi)層次結(jié)構(gòu)
 

irb(main):100:0> 1.class=> Fixnumirb(main):101:0> 1.class.superclass=> Integerirb(main):102:0> 1.class.superclass.superclass=> Numericirb(main):103:0> 1.class.superclass.superclass.superclass=> Object

到目前為止一切順利。現(xiàn)在您知道了類(lèi)本身是 Class 類(lèi)型的對(duì)象。而 Class 最終派生自 Object,如 清單 3 中所示使用 Ruby 內(nèi)置的 String 類(lèi)。

清單 3. 類(lèi)的類(lèi)層次結(jié)構(gòu)
 

irb(main):100:0> String.class=> Classirb(main):101:0> String.class.superclass=> Moduleirb(main):102:0> String.class.superclass.superclass=> Object

Module 是 Class 的基類(lèi),但是使用它時(shí)有一點(diǎn)要注意,即您不能直接實(shí)例化用戶定義的 Module 對(duì)象。如果您不想深入 Ruby 內(nèi)部,最好考慮與 C++ 命名空間有類(lèi)似特征的 Module:您可以定義您自己的方法、常量、等等。您在 Class 中包含了一個(gè) Module,以及 voilà,Module 的所有元素現(xiàn)在會(huì)魔法般地成為 Class 的元素。清單 4 提供了一個(gè)示例。

清單 4. Module 不能進(jìn)行直接實(shí)例化,并且只能與類(lèi)一同使用

irb(main):020:0> module MyModuleirb(main):021:1> def helloirb(main):022:2> puts "Hello World"irb(main):023:2> endirb(main):024:1> endirb(main):025:0> test = MyModule.newNoMethodError: undefined method `new' for MyModule:Module  from (irb):25irb(main):026:0> class MyClassirb(main):027:1> include MyModuleirb(main):028:1> end=> MyClassirb(main):029:0> test = MyClass.new=> #<MyClass:0x2c18bc8>irb(main):030:0> test.helloHello World=> nil

下面再重申一下重點(diǎn):當(dāng)您使用 Ruby 編寫(xiě) c = Cat.new 時(shí),c 是派生自 Object 的 Cat 類(lèi)型的一個(gè)對(duì)象。Cat 類(lèi)是 Class 類(lèi)型的一個(gè)對(duì)象,Class 派生自 Module,而 Module 又派生自 Object。因此該對(duì)象及其類(lèi)型都是有效的 Ruby 對(duì)象。

單例方法和可編輯類(lèi)

現(xiàn)在,看一下單例方法。假設(shè)您想使用 C++ 建模類(lèi)似于人類(lèi)社會(huì)的東西。那么您會(huì)如何做呢?定義一個(gè)名為 Human 的類(lèi),然后定義數(shù)百萬(wàn)的 Human 對(duì)象?這更像是在建模一個(gè)呆板的社會(huì);每個(gè)人必須具惟一的特征。Ruby 的單例方法在這里就派上了用場(chǎng),如 清單 5 所示。

清單 5. Ruby 中的單例方法
 

irb(main):113:0> y = Human.new=> #<Human:0x319b6f0>irb(main):114:0> def y.paintirb(main):115:1> puts "Can paint"irb(main):116:1> end=> nilirb(main):117:0> y.paintCan paint=> nilirb(main):118:0> z = Human.new=> #<Human:0x3153fc0>irb(main):119:0> z.paintNoMethodError: undefined method `paint' for #<Human:0x3153fc0>  from (irb):119

Ruby 中的單例方法 是僅與特定對(duì)象關(guān)聯(lián)的方法,不能用于一般的類(lèi)。它們的前綴是對(duì)象名稱(chēng)。在 清單 5 中,paint 方法特定于 y對(duì)象,而且僅限于 y 對(duì)象;z.paint 導(dǎo)致一個(gè) “方法未定義” 錯(cuò)誤。您可以調(diào)用 singleton_methods 來(lái)查明一個(gè)對(duì)象中的單例方法列表:
 

irb(main):120:0> y.singleton_methods=> ["paint"]

不過(guò)在 Ruby 中有另一種定義單例方法的方式。看看 清單 6 中的代碼。

清單 6. 創(chuàng)建單例方法的另一種方式
 

irb(main):113:0> y = Human.new=> #<Human:0x319b6f0>irb(main):114:0> class << yirb(main):115:1> def singirb(main):116:1> puts "Can sing"irb(main):117:1> endirb(main):118:1>end=> nilirb(main):117:0> y.singCan sing=> nil

 

 

 

清單 5 還開(kāi)創(chuàng)了新的可能性,可以添加新方法到用戶定義的類(lèi)和內(nèi)置的 Ruby 現(xiàn)有類(lèi),比如 String。這在 C++ 中是不可能實(shí)現(xiàn)的,除非您能夠訪問(wèn)您使用的類(lèi)的源代碼。再次觀察 String 類(lèi)(清單 7)。

清單 7. Ruby 允許您修改一個(gè)現(xiàn)有的類(lèi)

irb(main):035:0> y = String.new("racecar")=> "racecar"irb(main):036:0> y.methods.grep(/palindrome/)=> [ ]irb(main):037:0> class Stringirb(main):038:1> def palindrome?irb(main):039:2> self == self.reverseirb(main):040:2> endirb(main):041:1> endirb(main):050:0> y.palindrome?=> true

清單 7 清楚地展示了如何編輯一個(gè)現(xiàn)有的 Ruby 類(lèi)來(lái)添加您自行選擇的方法。這里,我添加了 palindrome? 方法到 String 類(lèi)。因此 Ruby 類(lèi)在運(yùn)行時(shí)是可編輯的(一個(gè)強(qiáng)大的屬性)。

現(xiàn)在您對(duì) Ruby 的類(lèi)層次結(jié)構(gòu)和單例有了一定的認(rèn)識(shí),接下來(lái)我們來(lái)看 self。注意,在定義 palindrome? 方法時(shí)我使用了 self。

發(fā)現(xiàn) self

self 關(guān)鍵詞的最常見(jiàn)用法可能就是在 Ruby 類(lèi)中聲明一個(gè)靜態(tài)方法,如 清單 8 所示。

清單 8. 使用 self 聲明類(lèi)的靜態(tài)方法

class SelfTest def self.test  puts "Hello World with self!" endend class SelfTest2 def test  puts "This is not a class static method" endend SelfTest.testSelfTest2.test

從 清單 8 的輸出中可以看到(如 清單 9 所示),沒(méi)有對(duì)象您無(wú)法調(diào)用非靜態(tài)方法。該行為類(lèi)似于 C++。

清單 9. 在沒(méi)有對(duì)象的情況下調(diào)用非靜態(tài)方法時(shí)會(huì)出錯(cuò)
 

irb(main):087:0> SelfTest.testHello World with self!=> nilirb(main):088:0> SelfTest2.testNoMethodError: undefined method 'test' for SelfTest2:Class  from (irb):88

在探討 self 更深?yuàn)W的用途和含義之前,注意您也可以通過(guò)在方法名稱(chēng)前面加上類(lèi)名來(lái)在 Ruby 中定義一個(gè)靜態(tài)方法:

class TestMe def TestMe.test  puts "Yet another static member function" endend TestMe.test # works fine


清單 10 提供了 self 的一個(gè)更有趣但不太容易找到的用法。

清單 10. 使用元類(lèi)來(lái)聲明靜態(tài)方法
 

class MyTest class << self  def test  puts "This is a class static method"  end endend MyTest.test # works fine

該段代碼以一種稍微不同的方式將 test 定義為一個(gè)類(lèi)靜態(tài)方法。要了解究竟發(fā)生了什么,您需要看一下 class << self 語(yǔ)法的一些細(xì)節(jié)。class << self … end 創(chuàng)建一個(gè)元類(lèi)。在方法查找鏈中,在訪問(wèn)對(duì)象的基類(lèi)之前先搜索該對(duì)象的元類(lèi)。如果您在元類(lèi)中定義一個(gè)方法,可以在類(lèi)上調(diào)用該方法。這類(lèi)似于 C++ 中靜態(tài)方法的概念。

可以訪問(wèn)一個(gè)元類(lèi)嗎?是的:只需從 class << self … end 內(nèi)返回 self。注意,在一個(gè) Ruby 類(lèi)聲明中,您沒(méi)有義務(wù)僅給出方法定義。清單 11 顯示了元類(lèi)。

清單 11. 理解元類(lèi)

irb(main):198:0> class MyTestirb(main):199:1> end=> nilirb(main):200:0> y = MyTest.new=> #< MyTest:0x2d43fe0>irb(main):201:0> z = class MyTestirb(main):202:1> class << selfirb(main):203:2> selfirb(main):204:2> endirb(main):205:1> end=> #<Class: MyTest >irb(main):206:0> z.class=> Classirb(main):207:0> y.class=> MyTest

回到 清單 7 的代碼,您會(huì)看到 palindrome 被定義為 self == self.reverse。在該上下文中,self 與 C++ 沒(méi)有什么區(qū)別。C++和 Ruby 中的方法都需要一個(gè)操作對(duì)象,以修改或提取狀態(tài)信息。self 是指這里的這個(gè)對(duì)象。注意,可以通過(guò)附加 self 前綴來(lái)選擇性地調(diào)用公共方法,指明方法付諸作用的對(duì)象,如 清單 12 所示。

清單 12. 使用 self 調(diào)用方法
 

irb(main):094:0> class SelfTest3irb(main):095:1> def fooirb(main):096:2> self.bar()irb(main):097:2> endirb(main):098:1> def barirb(main):099:2> puts "Testing Self"irb(main):100:2> endirb(main):101:1> end=> nilirb(main):102:0> test = SelfTest3.new=> #<SelfTest3:0x2d15750>irb(main):103:0> test.fooTesting Self=> nil

在 Ruby 中您無(wú)法通過(guò)附加 self 關(guān)鍵詞前綴來(lái)調(diào)用私有方法。對(duì)于一名 C++ 開(kāi)發(fā)人員,這可能會(huì)有點(diǎn)混淆。清單 13 中的代碼明確表示,self 不能用于私有方法:對(duì)私有方法的調(diào)用只能針對(duì)隱式對(duì)象。

清單 13. self 不能用于私有方法調(diào)用
 

irb(main):110:0> class SelfTest4irb(main):111:1> def method1irb(main):112:2> self.method2irb(main):113:2> endirb(main):114:1> def method3irb(main):115:2> method2irb(main):116:2> endirb(main):117:1> privateirb(main):118:1> def method2irb(main):119:2> puts "Inside private method"irb(main):120:2> endirb(main):121:1> end=> nilirb(main):122:0> y = SelfTest4.new=> #<SelfTest4:0x2c13d80>irb(main):123:0> y.method1NoMethodError: private method `method2' called for #<SelfTest4:0x2c13d80>  from (irb):112:in `method1'irb(main):124:0> y.method3Inside private method=> nil

由于 Ruby 中的一切都是對(duì)象,當(dāng)在 irb 提示符上調(diào)用 self 時(shí)您會(huì)得到以下結(jié)果:

irb(main):104:0> self=> mainirb(main):105:0> self.class=> Object


一啟動(dòng) irb,Ruby 解釋器就為您創(chuàng)建主對(duì)象。這一主對(duì)象在 Ruby 相關(guān)的文章中也被稱(chēng)為頂層上下文。

關(guān)于 self 就介紹這么多了。下面我們接著來(lái)看動(dòng)態(tài)方法和 method_missing 方法。

method_missing 揭秘

看一下 清單 14 中的 Ruby 代碼。

清單 14. 運(yùn)行中的 method_missing
 

irb(main):135:0> class Testirb(main):136:1> def method_missing(method, *args)irb(main):137:2> puts "Method: #{method} Args: (#{args.join(', ')})"irb(main):138:2> endirb(main):139:1> end=> nilirb(main):140:0> t = Test.new=> #<Test:0x2c7b850>irb(main):141:0> t.f(23)Method: f Args: (23)=> nil
顯然,如果 voodoo 是您喜歡的,那么清單 14 會(huì)給您這個(gè)恩典。這里發(fā)生什么了呢?我們創(chuàng)建了一個(gè) Test 類(lèi)型的對(duì)象,然后調(diào)用了t.f,以 23 作為參數(shù)。但是 Test 沒(méi)有以 f 作為方法,您應(yīng)當(dāng)會(huì)得到一個(gè) NoMethodError 或類(lèi)似的錯(cuò)誤消息。Ruby 在這里做了一件很棒的事情:您的方法調(diào)用被阻截并由 method_missing 處理。method_missing 的第一個(gè)參數(shù)是缺失的方法名,在本例中是f。第二個(gè)(也是最后一個(gè))參數(shù)是 *args,該參數(shù)捕獲傳遞給 f 的參數(shù)。您可以在何處使用像這樣的參數(shù)呢?在眾多選項(xiàng)之中,您可以輕松地將方法調(diào)用轉(zhuǎn)發(fā)到一個(gè)包含的 Module 或一個(gè)組件對(duì)象,而不為頂級(jí)類(lèi)中的每個(gè)調(diào)用顯式提供一個(gè)包裝應(yīng)用程序編程接口。

在 清單 15 中查看更多 voodoo。

清單 15. 使用 send 方法將參數(shù)傳遞給一個(gè)例程
 

irb(main):142:0> class Testirb(main):143:1> def method1(s, y)irb(main):144:2> puts "S: #{s} Y: #{y}"irb(main):145:2> endirb(main):146:1> end=> nilirb(main):147:0>t = Test.newirb(main):148:0> t.send(:method1, 23, 12)S: 23 Y: 12=> nil
在 清單 15 中,class Test 有一個(gè)名為 method1 的方法被定義。但是,這里沒(méi)有直接調(diào)用方法,而是發(fā)出對(duì) send 方法的調(diào)用。send 是 Object 類(lèi)的一個(gè)公共方法,因此可用于 Test(記住,所有類(lèi)都派生自 Object)。send 方法的第一個(gè)參數(shù)是表示方法名稱(chēng)的一個(gè)符號(hào)和字符串。send 方法可以做到哪些您通常無(wú)法做到的事情?您可以使用 send 方法訪問(wèn)一個(gè)類(lèi)的私有方法。當(dāng)然,對(duì)于這是否是一個(gè)好特性仍然頗具爭(zhēng)議。看一下 清單 16 中的代碼。

清單 16. 訪問(wèn)類(lèi)私有方法
 

irb(main):258:0> class SendTestirb(main):259:1> privateirb(main):260:1> def helloirb(main):261:2> puts "Saying Hello privately"irb(main):262:2> endirb(main):263:1> end=> nilirb(main):264:0> y = SendTest.new=> #< SendTest:0x2cc52c0>irb(main):265:0> y.helloNoMethodError: private method `hello' called for #< SendTest:0x2cc52c0>  from (irb):265irb(main):266:0> y.send(:hello)Saying Hello privately=> nil
Throw 和 catch 并非表面那樣

如果您像我一樣具有 C++ 工作背景,且試圖編寫(xiě)異常安全代碼,那么在看到 Ruby 有 throw 和 catch 關(guān)鍵詞時(shí)會(huì)開(kāi)始感到異常親切。遺憾的是,throw 和 catch 在 Ruby 中的含義完全不同。

Ruby 通常使用 begin…rescue 塊處理異常。清單 17 提供了一個(gè)示例。

清單 17. Ruby 中的異常處理
 

begin f = File.open("ruby.txt") # .. continue file processingrescue ex => Exception # .. handle errors, if anyensure f.close unless f.nil? # always execute the code in ensure blockend
在 清單 17 中,如果在試圖打開(kāi)文件時(shí)出錯(cuò)(可能是缺少文件或文件權(quán)限方面的問(wèn)題),rescue 塊中的代碼會(huì)運(yùn)行。ensure 塊中的代碼始終運(yùn)行,不管是否有任何異常引發(fā)。注意,rescue 塊后面是否緊跟 ensure 塊是可選的。另外,如果必須顯式地拋出一個(gè)異常,那么語(yǔ)法是 raise <MyException>。如果您選擇擁有您自己的異常類(lèi),可能會(huì)希望從 Ruby 內(nèi)置的 Exception 類(lèi)派生出相同的類(lèi),以利用現(xiàn)有方法。

Ruby 中的 catch 和 throw 代碼塊實(shí)際上不是異常處理:您可以使用 throw 修改程序流程。清單 18 顯示了一個(gè)使用 throw 和 catch的示例。

清單 18. Ruby 中的 Throw 和 catch
 

irb(main):185:0> catch :label doirb(main):186:1* puts "This will print"irb(main):187:1> throw :labelirb(main):188:1> puts "This will not print"irb(main):189:1> endThis will print=> nil
在 清單 18 中,當(dāng)代碼運(yùn)行到 throw 語(yǔ)句時(shí),執(zhí)行會(huì)被中斷,解釋器開(kāi)始尋找處理相應(yīng)符號(hào)的一個(gè) catch 塊。在 catch 塊結(jié)束的地方繼續(xù)執(zhí)行。查看 清單 19 中的 throw 和 catch 示例:注意,您可以輕松將 catch 和 throw 語(yǔ)句用于各個(gè)函數(shù)。

有些人甚至說(shuō),Ruby 中對(duì) catch 和 throw 的支持將 C goto 行為帶到一個(gè)全新的高度。鑒于函數(shù)可以有多個(gè)嵌套層,而 catch 塊可能在每一級(jí),goto 行為類(lèi)比似乎有據(jù)可循。

 清單 19. Ruby 中的異常處理:嵌套的 catch 塊
 

irb(main):190:0> catch :label doirb(main):191:1* catch :label1 doirb(main):192:2* puts "This will print"irb(main):193:2> throw :labelirb(main):194:2> puts "This won't print"irb(main):195:2> endirb(main):196:1> puts "Neither will this print"irb(main):197:1> endThis will print=> nil
Ruby 中的線程可以是綠色的

Ruby 版本 1.8.7 不支持真正的并發(fā)性。確實(shí)不支持。但是您會(huì)說(shuō),在 Ruby 中有 Thread 構(gòu)造函數(shù)。您說(shuō)的沒(méi)錯(cuò)。不過(guò)這個(gè)Thread.new 不會(huì)在您每次調(diào)用同一方法時(shí)生成一個(gè)真實(shí)的操作系統(tǒng)線程。Ruby 支持的是綠色線程:Ruby 解釋器使用單一操作系統(tǒng)線程來(lái)處理來(lái)自多個(gè)應(yīng)用程序級(jí)線程的工作負(fù)載。

當(dāng)某個(gè)線程等待一些輸入/輸出發(fā)生時(shí),這一 “綠色線程” 概念很有用,而且您可以輕松調(diào)度一個(gè)不同的 Ruby 線程來(lái)充分利用 CPU。但是這一構(gòu)造函數(shù)無(wú)法使用現(xiàn)代的多核 CPU(維基百科提供了一段內(nèi)容,很好地解釋了什么是綠色線程。參見(jiàn) 參考資料 獲取鏈接)。

最后這一個(gè)示例(參見(jiàn) 清單 20)證明了這一點(diǎn)。

清單 20. Ruby 中的多個(gè)線程

#!/usr/bin/env ruby def func(id, count) i = 0; while (i < count) puts "Thread #{i} Time: #{Time.now}" sleep(1) i = i + 1 endend puts "Started at #{Time.now}"thread1 = Thread.new{func(1, 100)}thread2 = Thread.new{func(2, 100)}thread3 = Thread.new{func(3, 100)}thread4 = Thread.new{func(4, 100)} thread1.jointhread2.jointhread3.jointhread4.joinputs "Ending at #{Time.now}"

假設(shè)您的 Linux? 或 UNIX? 機(jī)器上擁有 top 實(shí)用程序,在終端運(yùn)行代碼,獲取進(jìn)程 ID,然后再運(yùn)行 top

中文字幕亚洲欧美| 欧美日韩在线综合| 日韩欧美综合视频| 中文字幕在线视频久| 国产久卡久卡久卡久卡视频精品| 伊人中文字幕在线观看| 欧美亚洲国产日韩2020| 亚洲精品欧美二区三区中文字幕| 国产黄色精品| 日韩视频专区| 国产一区 二区 三区一级| 日韩欧美中文字幕视频| 色综合影院在线| 欧美 亚洲 精品 三区| 在线一区二区三区精品| 日韩三级精品电影久久久| 日韩在线视频一区二区三区| 伊人亚洲视频| 中文字幕精品视频在线| 日韩高清不卡一区二区| 亚洲欧美小说国产图片| 欧美国产一级片| 国产成人综合av| 中文字幕欧美日韩在线| 91蜜桃婷婷狠狠久久综合9色| 亚洲三级网站| 欧美在线中文字幕| 欧美1234区| 午夜国产在线视频| 免费精品国产自产拍观看| 国产视频中文字幕在线观看| 亚洲.国产.中文慕字在线| 欧美一级久久久久久久久大| 国产欧美日韩在线观看| 中文欧美日韩| 欧美日韩精品高清| 国产一卡二卡3卡4卡四卡在线| 不卡在线视频| 日韩精品手机在线| 欧美日韩精品免费| 伊人国产视频| 国产激情在线观看| 欧美久久久精品| 久久99精品久久久久婷婷| 国产一卡2卡3卡4卡网站免费 | 中文字幕 欧美 日韩| 在线免费播放av| 欧美xxxx中国| 欧美日韩性视频一区二区三区| 日韩视频在线免费看| 国产欧美日韩在线看| 在线精品日韩| 欧美日韩三级在线| 日本精品在线播放| 日韩在线欧美| 国产黄色在线看| 国产乱国产乱老熟300| 亚洲乱码在线观看| 中文字幕亚洲欧美| 精品日本视频| 亚洲欧美日本另类| 日韩精品视频免费| 欧美 日韩 综合| 91麻豆精品国产91久久久使用方法| www.老鸭窝.com| 免费视频最近日韩| 中文字幕伊人| 亚洲欧美日本另类| 国产一区 二区 三区一级| 91久久精品午夜一区二区| 国产小视频在线观看免费| 日韩午夜黄色| 亚洲综合在线电影| 国产亚洲欧美中文| 国产不卡精品在线| 亚洲一区中文在线| 欧美日韩高清一区二区| 久久久91精品国产| 日韩在线中文| 国产欧美综合视频| 欧洲精品在线视频| 日韩欧美国产三级| 欧美日韩在线精品成人综合网| 天天在线视频色| 国产香蕉免费精品视频| 欧美日韩国产中文| 三级精品视频| 精品乱人伦一区二区三区| 欧美日韩亚洲91| 欧美日韩性视频| 青青久在线视频免费观看| 欧美久久一二三四区| 午夜高潮免费视频| 一区二区日韩免费看| 日韩欧美中文字幕在线观看| 亚洲热在线观看| 日韩免费视频一区二区视频在线观看 | 国产一级片网站| 日韩中文字幕视频在线观看| 免费国产h视频在线观看86| 刘玥91精选国产在线观看| 国产成人精品三级| 亚洲第一视频| 黄色精品在线观看| 日韩精品视频在线观看免费| 亚洲日本精品视频| 国产69精品久久久久孕妇国产69久久 | 欧美日韩国产91| 亚洲制服一区| 日本精品在线播放| 欧美日中文字幕| 日韩欧美一级二级三级久久久| 中文不卡在线| 精品视频国产| 日韩视频在线一区| 日韩精品乱码av一区二区| 中文字幕在线精品| 国产视频二区| 国产一级粉嫩xxxx| 国内不卡的二区三区中文字幕| 亚洲福利一区二区三区| 精品久久在线| 91最新在线| 欧美三级在线播放| 免费在线亚洲| 在线一区免费| 亚洲天堂国产视频| 国产免费播放一区二区| 91精品国产日韩91久久久久久| 亚洲综合在线中文字幕| 日韩wumaV| 日韩欧美在线视频日韩欧美在线视频| 国产福利不卡| 亚洲综合视频一区| 亚洲一卡二卡在线观看| 精品一二三四| 欧美日韩精品在线播放| 欧美 日韩 综合| 中文在线不卡视频| 国产黄色精品| 亚洲羞羞网站| 99视频精品全国免费| 国产福利第一页| 国产乱码午夜在线视频| 一区二区三区在线不卡| 91av久久久| 在线一区av| 欧美xxxx中国| 91精品国产综合久久久蜜臀粉嫩| 中文字幕综合在线| 久久精品最新免费国产成人| eeuss一区| 久久精品视频免费看| 欧美亚洲专区| 日韩欧美在线字幕| 91精品婷婷国产综合久久竹菊| 精品亚洲国内自在自线福利| av一区二区高清| 久久夜色精品国产欧美乱极品| 国产乱国产乱300精品| 国产在线观看黄色| 欧美国产日韩在线播放| 亚洲欧美久久久| 久久99精品久久久久婷婷| 国产视频不卡| 亚洲女人天堂色在线7777| 一区二区三区免费看视频| 一区二区三区精品99久久| 日韩中文字幕久久| 91av久久久| 国产91久久久久蜜臀青青天草二| 国产黄色在线播放| 亚洲乱码一区av黑人高潮| 免费在线国产| 中文字幕久精品免费视频| 亚洲第一网中文字幕| 中文字幕视频一区二区三区久| 亚洲黄色片在线观看| 精品国产乱码久久久久久牛牛| a天堂中文在线官网在线| 亚洲成av人片在线| 亚洲一区在线视频观看| 日韩欧美不卡| 久久精品日韩无码| 91精品国产手机| 欧美 日韩 综合| 日韩在线视频一区| 欧美 日韩 中文字幕| 一级日本免费的| 91极品视频在线观看| 欧美日韩一级视频| 欧美日韩高清在线| 免费在线亚洲| 中文字幕欧美人妻精品一区蜜臀| 国产不卡一区二区在线观看| 日韩精品免费观看视频 | 中文字幕久精品免费视频| 国产一级片在线播放| 欧美日韩中文字幕在线观看| 亚洲欧美999| 中文字幕在线中文字幕二区| 欧美日韩亚洲视频| 91色在线看| 91精品国产综合久久香蕉最新版 | 中文字幕 亚洲一区| 一区二区不卡视频在线观看| 国产三级精品网站| 日韩欧美不卡| 欧美日韩精品是欧美日韩精品| 欧美不卡视频一区发布| 日韩国产91| 中文字幕精品一区二区三区在线| 久久婷婷综合国产| 欧美 日韩 国产 在线观看| 日韩欧美成人一区二区三区| 精品一二三四区| 中文字幕线观看| www..com日韩| 国产一级片网站| 不卡av免费在线| 国产一级免费在线观看| 婷婷中文字幕一区三区| 久久久久久自在自线| 亚洲热线99精品视频| 亚洲欧美久久234| 久草视频观看| 亚洲素人一区二区| 日韩一级免费在线观看| lutube成人福利在线观看| 国产视频一区三区| 日韩精品视频在线观看网址| 欧美二区在线观看| 亚洲欧洲三级| 国产黄色在线免费观看| 不卡一二三区| 国产乱码午夜在线视频| 久久精品最新免费国产成人| 亚洲视频一二三四| 中文字幕在线观看视频www| 中文字幕 欧美日韩| 色www精品视频在线观看| 99精品视频国产| 交视频在线观看国产| 91精品观看| 中文字幕一区不卡| 日韩欧美在线视频| 国产字幕在线看| 欧美日韩精品综合在线| 日韩福利视频导航| av一卡二卡| 中文字幕五月天| 国产xxx在线| 日韩在线视频在线观看| 国产黄色精品| 国产亚洲欧美色| 精品久久电影| 亚洲综合欧美在线| 欧美高清一级片在线| 欧美亚洲免费高清在线观看| 中文字幕最新精品| 国产乱国产乱300精品| 久久久精品网| 日韩在线视频观看| 日韩综合精品| 快she精品国产999| 精品国产乱码一区二区| 亚洲日本欧美日韩高观看| 日韩视频在线一区| 91最新在线| 日韩在线视频一区| 亚洲三级免费看| 欧美一级免费看| 亚洲成在线观看| 中文官网资源新版中文第二页在线观看| 亚洲视频一二三四| 国产成人精品综合网站| 69免费视频| 国产资源在线观看| 在线视频三区| 视频一区二区中文字幕| 91精品网站| 欧美成人一区二区| 日韩在线小视频| 精品免费久久久| 日韩三级视频在线| 精品一区二区三区中文字幕| 欧美久久一二三四区| 国产日韩精品在线看| 国产欧美日韩在线看| aa国产成人| 亚欧成人精品| 日韩wumaV| 成人精品国产福利| 黄色一级大片在线免费看国产一| 国产午夜精品久久| av一级在线| 中文国产字幕在线观看| 亚洲第一网中文字幕| 久久视频免费看| 黄色欧美日韩| 69堂精品视频在线播放| 久久riav| 欧美国产亚洲一区| 国产乱国产乱老熟300| 国产欧美久久久久久久久| 国产性一级片| 日韩精品免费视频一区二区三区| 日韩在线视频网| 久久久水蜜桃| 国产伦精品免费视频| 国产在线观看色| 中文字幕无线码一区| 91精品视频在线| 91精品久久久久久久久久| 日本不卡高清视频一区| 国产一级在线免费观看| 日韩在线播放一区二区| 国产午夜精品视频免费不卡69堂| 日韩视频在线免费播放| 欧美三级在线视频| 91精品国产综合久久久久久| 国产欧美高清在线| 日韩高清在线不卡| 精品久久久久久综合日本欧美| 欧美日韩中文| 在线三级av| 中文字幕欧美人妻精品一区蜜臀 | 精品国产乱码久久久久久蜜臀| 国产欧美第一页| 精品视频资源站| 日本va欧美va精品发布| 日韩国产亚洲欧美| 日韩精品视频在线播放| 日韩国产高清一区| 欧美国产日韩在线播放| 在线一区av| 婷婷精品进入| 国内精品露脸在线视频播放| 婷婷中文字幕一区| 亚洲开心激情| 亚洲视频日韩| 黄色片免费在线| 欧美亚洲天堂| 中文字幕亚洲第一| 国产区视频在线观看| 中文字幕中文字幕精品| 精品国产31久久久久久| 亚洲视频日韩| 欧美久久久久久蜜桃| 国产一级片播放| 久久91精品国产91久久小草| 九九视频精品免费| 日韩精品视频在线免费观看| 欧美国产一级片| 深夜福利亚洲| 日韩在线a电影| 91精品国产日韩91久久久久久| 欧美 日韩 国产 在线| 日韩中文字幕观看| 91麻豆免费视频网站| 国产网站av| 日韩欧美中文字幕精品| 日韩欧美一二三区| 日韩欧美国产午夜精品| 日韩不卡一二区| 最近中文字幕在线中文高清版| 福利在线国产| 欧美色欧美亚洲高清在线视频| 精品婷婷伊人一区三区三| 国产欧亚日韩视频| 国产午夜精品久久| 国产永久免费高清在线观看| 在线观看一区日韩| 国产免费一级| 日韩在线高清视频| 日韩亚洲一区在线| 日韩视频精品| 国产91久久久久| 亚洲免费中文字幕| 国产乱国产乱300精品| 区日韩二区欧美三区| 在线综合 亚洲 欧美中文字幕| 中文字幕在线官网| 国内不卡的二区三区中文字幕| 黄色在线播放网站| 中文官网资源新版中文第二页在线观看 | 国产成人精品综合网站| 91久久中文| 午夜伊人狠狠久久| 日韩精品视频在线观看视频| 国产成人精品av久久| 日韩中文字幕二区| 日韩国产欧美在线视频| 中文欧美日韩| 国产第一页在线播放| 国产蜜臀在线| 国产欧美日韩精品高清二区综合区| 中文字幕狠狠干| 国产在线www| 欧美 日韩 国产在线|