婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 用實際代碼演示Ruby的容易被誤解的6個特性

用實際代碼演示Ruby的容易被誤解的6個特性

熱門標簽:天津外呼系統怎么收費 中牟外呼系統違法嗎 AI電銷機器人 線路 巫師3地圖標注魔力之所 外呼線路從哪里出來的 征服者企業地圖標注 漯河電銷 淮安自動外呼系統供應商 柯城手機地圖如何做地圖標注

簡介: 假設您是一名 C++ 開發人員,您需要使用 Ruby 快速執行一些原型設計。當您拿起一本 Ruby 參考書籍(比如 Pickaxe)或瀏覽 Ruby 網站時,會看到一些熟悉的構造,比如類聲明、線程支持和異常處理。正當您認為自己了解 Ruby 的工作原理之時,您意識到了,您 Ruby 代碼中的并發機制與 Boost 線程工作原理不一樣,catch 和 throw 也與它們看上去的大不相同,而且其他人在其 Ruby 腳本中各處使用了名為 self 的關鍵詞。歡迎來到 Ruby 的世界中!

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

● Ruby 類層次結構

● Ruby 中的單例方法

● self 關鍵詞

● method_missing 方法

● 異常處理

● 線程

 

注意:本文中所有的代碼均進行測試,且基于 Ruby 版本 1.8.7。

 

Ruby 中的類層次結構

Ruby 中的類層次結構會很棘手。創建一個 Cat 類型的類并開始探討其層次結構(參見 清單 1)。

清單 1. Ruby 中的隱式類層次結構

 

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

Ruby 中的所有對象(甚至用戶定義的對象)都是 Object 類的后代,這在清單 1 中清晰可見。這與 C++ 是鮮明的對比。這一點也不像普通數據類型,例如 C/C++ int 或 double。清單 2 顯示了整數 1 的類層次結構。

清單 2. 整數 1 的類層次結構
 

irb(main):100:0> 1.class
=> Fixnum
irb(main):101:0> 1.class.superclass
=> Integer
irb(main):102:0> 1.class.superclass.superclass
=> Numeric
irb(main):103:0> 1.class.superclass.superclass.superclass
=> Object

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

清單 3. 類的類層次結構
 

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

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

清單 4. Module 不能進行直接實例化,并且只能與類一同使用

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

下面再重申一下重點:當您使用 Ruby 編寫 c = Cat.new 時,c 是派生自 Object 的 Cat 類型的一個對象。Cat 類是 Class 類型的一個對象,Class 派生自 Module,而 Module 又派生自 Object。因此該對象及其類型都是有效的 Ruby 對象。

單例方法和可編輯類

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

清單 5. Ruby 中的單例方法
 

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

Ruby 中的單例方法 是僅與特定對象關聯的方法,不能用于一般的類。它們的前綴是對象名稱。在 清單 5 中,paint 方法特定于 y對象,而且僅限于 y 對象;z.paint 導致一個 “方法未定義” 錯誤。您可以調用 singleton_methods 來查明一個對象中的單例方法列表:
 

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

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

清單 6. 創建單例方法的另一種方式
 

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

 

 

 

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

清單 7. Ruby 允許您修改一個現有的類

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

清單 7 清楚地展示了如何編輯一個現有的 Ruby 類來添加您自行選擇的方法。這里,我添加了 palindrome? 方法到 String 類。因此 Ruby 類在運行時是可編輯的(一個強大的屬性)。

現在您對 Ruby 的類層次結構和單例有了一定的認識,接下來我們來看 self。注意,在定義 palindrome? 方法時我使用了 self。

發現 self

self 關鍵詞的最常見用法可能就是在 Ruby 類中聲明一個靜態方法,如 清單 8 所示。

清單 8. 使用 self 聲明類的靜態方法

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

從 清單 8 的輸出中可以看到(如 清單 9 所示),沒有對象您無法調用非靜態方法。該行為類似于 C++。

清單 9. 在沒有對象的情況下調用非靜態方法時會出錯
 

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

在探討 self 更深奧的用途和含義之前,注意您也可以通過在方法名稱前面加上類名來在 Ruby 中定義一個靜態方法:

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


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

清單 10. 使用元類來聲明靜態方法
 

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

該段代碼以一種稍微不同的方式將 test 定義為一個類靜態方法。要了解究竟發生了什么,您需要看一下 class self 語法的一些細節。class self … end 創建一個元類。在方法查找鏈中,在訪問對象的基類之前先搜索該對象的元類。如果您在元類中定義一個方法,可以在類上調用該方法。這類似于 C++ 中靜態方法的概念。

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

清單 11. 理解元類

irb(main):198:0> class MyTest
irb(main):199:1> end
=> nil
irb(main):200:0> y = MyTest.new
=> # MyTest:0x2d43fe0>
irb(main):201:0> z = class MyTest
irb(main):202:1> class  self
irb(main):203:2> self
irb(main):204:2> end
irb(main):205:1> end
=> #Class: MyTest >
irb(main):206:0> z.class
=> Class
irb(main):207:0> y.class
=> MyTest

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

清單 12. 使用 self 調用方法
 

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

在 Ruby 中您無法通過附加 self 關鍵詞前綴來調用私有方法。對于一名 C++ 開發人員,這可能會有點混淆。清單 13 中的代碼明確表示,self 不能用于私有方法:對私有方法的調用只能針對隱式對象。

清單 13. self 不能用于私有方法調用
 

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

由于 Ruby 中的一切都是對象,當在 irb 提示符上調用 self 時您會得到以下結果:

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


一啟動 irb,Ruby 解釋器就為您創建主對象。這一主對象在 Ruby 相關的文章中也被稱為頂層上下文。

關于 self 就介紹這么多了。下面我們接著來看動態方法和 method_missing 方法。

method_missing 揭秘

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

清單 14. 運行中的 method_missing
 

irb(main):135:0> class Test
irb(main):136:1> def method_missing(method, *args)
irb(main):137:2> puts "Method: #{method} Args: (#{args.join(', ')})"
irb(main):138:2> end
irb(main):139:1> end
=> nil
irb(main):140:0> t = Test.new
=> #Test:0x2c7b850>
irb(main):141:0> t.f(23)
Method: f Args: (23)
=> nil

顯然,如果 voodoo 是您喜歡的,那么清單 14 會給您這個恩典。這里發生什么了呢?我們創建了一個 Test 類型的對象,然后調用了t.f,以 23 作為參數。但是 Test 沒有以 f 作為方法,您應當會得到一個 NoMethodError 或類似的錯誤消息。Ruby 在這里做了一件很棒的事情:您的方法調用被阻截并由 method_missing 處理。method_missing 的第一個參數是缺失的方法名,在本例中是f。第二個(也是最后一個)參數是 *args,該參數捕獲傳遞給 f 的參數。您可以在何處使用像這樣的參數呢?在眾多選項之中,您可以輕松地將方法調用轉發到一個包含的 Module 或一個組件對象,而不為頂級類中的每個調用顯式提供一個包裝應用程序編程接口。

在 清單 15 中查看更多 voodoo。

清單 15. 使用 send 方法將參數傳遞給一個例程
 

irb(main):142:0> class Test
irb(main):143:1> def method1(s, y)
irb(main):144:2> puts "S: #{s} Y: #{y}"
irb(main):145:2> end
irb(main):146:1> end
=> nil
irb(main):147:0>t = Test.new
irb(main):148:0> t.send(:method1, 23, 12)
S: 23 Y: 12
=> nil

在 清單 15 中,class Test 有一個名為 method1 的方法被定義。但是,這里沒有直接調用方法,而是發出對 send 方法的調用。send 是 Object 類的一個公共方法,因此可用于 Test(記住,所有類都派生自 Object)。send 方法的第一個參數是表示方法名稱的一個符號和字符串。send 方法可以做到哪些您通常無法做到的事情?您可以使用 send 方法訪問一個類的私有方法。當然,對于這是否是一個好特性仍然頗具爭議。看一下 清單 16 中的代碼。

清單 16. 訪問類私有方法
 

irb(main):258:0> class SendTest
irb(main):259:1> private
irb(main):260:1> def hello
irb(main):261:2> puts "Saying Hello privately"
irb(main):262:2> end
irb(main):263:1> end
=> nil
irb(main):264:0> y = SendTest.new
=> # SendTest:0x2cc52c0>
irb(main):265:0> y.hello
NoMethodError: private method `hello' called for # SendTest:0x2cc52c0>
  from (irb):265
irb(main):266:0> y.send(:hello)
Saying Hello privately
=> nil

Throw 和 catch 并非表面那樣

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

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

清單 17. Ruby 中的異常處理
 

begin
 f = File.open("ruby.txt")
 # .. continue file processing
rescue ex => Exception
 # .. handle errors, if any
ensure
 f.close unless f.nil?
 # always execute the code in ensure block
end

在 清單 17 中,如果在試圖打開文件時出錯(可能是缺少文件或文件權限方面的問題),rescue 塊中的代碼會運行。ensure 塊中的代碼始終運行,不管是否有任何異常引發。注意,rescue 塊后面是否緊跟 ensure 塊是可選的。另外,如果必須顯式地拋出一個異常,那么語法是 raise MyException>。如果您選擇擁有您自己的異常類,可能會希望從 Ruby 內置的 Exception 類派生出相同的類,以利用現有方法。

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

清單 18. Ruby 中的 Throw 和 catch
 

irb(main):185:0> catch :label do
irb(main):186:1* puts "This will print"
irb(main):187:1> throw :label
irb(main):188:1> puts "This will not print"
irb(main):189:1> end
This will print
=> nil

在 清單 18 中,當代碼運行到 throw 語句時,執行會被中斷,解釋器開始尋找處理相應符號的一個 catch 塊。在 catch 塊結束的地方繼續執行。查看 清單 19 中的 throw 和 catch 示例:注意,您可以輕松將 catch 和 throw 語句用于各個函數。

有些人甚至說,Ruby 中對 catch 和 throw 的支持將 C goto 行為帶到一個全新的高度。鑒于函數可以有多個嵌套層,而 catch 塊可能在每一級,goto 行為類比似乎有據可循。

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

irb(main):190:0> catch :label do
irb(main):191:1* catch :label1 do
irb(main):192:2* puts "This will print"
irb(main):193:2> throw :label
irb(main):194:2> puts "This won't print"
irb(main):195:2> end
irb(main):196:1> puts "Neither will this print"
irb(main):197:1> end
This will print
=> nil

Ruby 中的線程可以是綠色的

Ruby 版本 1.8.7 不支持真正的并發性。確實不支持。但是您會說,在 Ruby 中有 Thread 構造函數。您說的沒錯。不過這個Thread.new 不會在您每次調用同一方法時生成一個真實的操作系統線程。Ruby 支持的是綠色線程:Ruby 解釋器使用單一操作系統線程來處理來自多個應用程序級線程的工作負載。

當某個線程等待一些輸入/輸出發生時,這一 “綠色線程” 概念很有用,而且您可以輕松調度一個不同的 Ruby 線程來充分利用 CPU。但是這一構造函數無法使用現代的多核 CPU(維基百科提供了一段內容,很好地解釋了什么是綠色線程。參見 參考資料 獲取鏈接)。

最后這一個示例(參見 清單 20)證明了這一點。

清單 20. Ruby 中的多個線程

#!/usr/bin/env ruby
 
def func(id, count)
 i = 0;
 while (i  count)
 puts "Thread #{i} Time: #{Time.now}"
 sleep(1)
 i = i + 1
 end
end
 
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.join
thread2.join
thread3.join
thread4.join
puts "Ending at #{Time.now}"

假設您的 Linux? 或 UNIX? 機器上擁有 top 實用程序,在終端運行代碼,獲取進程 ID,然后再運行 top –p process id>。top啟動后,按住 Shift-H 來列出運行中線程的數量。您應當只能看到一個線程,確認了這一點:Ruby 1.8.7 中的并發性不過是個神話。

總的看來,綠色線程沒有什么壞處。它們在重負荷輸入/輸出密集型程序中仍然有用,更不用說該方法可能是操作系統間最可移植的一個了。

 

結束語

本文涵蓋了以下多個方面:

● Ruby 中類層次結構的概念

● 單例方法

● 解釋 self 關鍵詞和 method_missing 方法

● 異常

● 線程

盡管 Ruby 不乏特立獨行之處,但是使用它進行編程還是挺有趣的,而且其以最少的代碼完成大量工作的能力還是很強大的。難怪 Twitter 這樣的大型應用程序會使用 Ruby 來駕馭其真正的潛力。祝您有個快樂的 Ruby 編程體驗!

您可能感興趣的文章:
  • CentOS中配置Ruby on Rails環境
  • ruby on rails 代碼技巧
  • 攻克CakePHP(PHP中的Ruby On Rails框架)圖文介紹

標簽:甘孜 西雙版納 南昌 內江 克拉瑪依 大慶 棗莊 河池

巨人網絡通訊聲明:本文標題《用實際代碼演示Ruby的容易被誤解的6個特性》,本文關鍵詞  用,實際,代碼,演示,Ruby,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《用實際代碼演示Ruby的容易被誤解的6個特性》相關的同類信息!
  • 本頁收集關于用實際代碼演示Ruby的容易被誤解的6個特性的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲摸摸操操av| 亚洲色图20p| 亚洲欧美日韩久久| 99久久er热在这里只有精品66| 一个色在线综合| 欧美久久久久中文字幕| 精品污污网站免费看| 色婷婷精品大视频在线蜜桃视频| 亚洲图片欧美一区| 欧美精品tushy高清| 欧美三级乱人伦电影| 久久国产精品免费| 亚洲超碰97人人做人人爱| 日韩精品在线网站| 欧美在线观看你懂的| 国产精品1区2区3区在线观看| 亚洲成人动漫av| 国产精品天天看| 欧美一区二区三区在线电影| 国产精品一区2区| 国产在线视视频有精品| 亚洲成人免费在线观看| 成人av免费观看| 另类的小说在线视频另类成人小视频在线| 一区二区三区av电影| 国产精品久久久一区麻豆最新章节| 欧美久久一二区| 日本丰满少妇一区二区三区| 国产成人无遮挡在线视频| 美洲天堂一区二卡三卡四卡视频| 亚洲精品日日夜夜| 国产午夜精品美女毛片视频| 欧美精品一区二区三区高清aⅴ | 欧美影片第一页| 国产毛片精品一区| 日本va欧美va欧美va精品| 亚洲第一av色| 国产精品拍天天在线| 久久久久久久综合色一本| 久久久久久久久久久久久夜| 精品乱人伦一区二区三区| 精品国产凹凸成av人导航| 欧美日韩午夜精品| 日日嗨av一区二区三区四区| 一区二区三区精品视频| 亚洲一区视频在线| 日韩成人dvd| 视频一区视频二区中文| 久久综合久久综合亚洲| 国产精品一级片| 视频在线观看91| 婷婷开心激情综合| 亚洲成人av免费| 视频一区在线视频| 国产精品网曝门| 制服.丝袜.亚洲.另类.中文| 欧美日韩精品一区二区| 精品三级在线观看| 久久久综合视频| 欧美不卡在线视频| 国产精品白丝在线| 18欧美亚洲精品| 图片区小说区区亚洲影院| 亚洲激情男女视频| 日本午夜一区二区| 国产一区二区福利视频| 成人黄色小视频在线观看| 午夜婷婷国产麻豆精品| 日韩有码一区二区三区| 亚洲裸体xxx| 亚洲欧洲色图综合| 日本在线不卡视频一二三区| 91欧美一区二区| 欧美精品一区在线观看| 五月激情综合色| 色天使久久综合网天天| 精品电影一区二区三区 | 在线播放国产精品二区一二区四区| 精品久久99ma| 亚洲天堂精品在线观看| 韩国女主播一区| 在线观看日韩国产| 日本一区二区三区dvd视频在线| 亚洲一区二区视频| 精品在线免费观看| 色婷婷av一区二区三区之一色屋| 欧美人体做爰大胆视频| 一区在线中文字幕| 粉嫩13p一区二区三区| 日韩一区二区精品在线观看| 亚洲国产精品一区二区久久| 成人免费视频视频在线观看免费| 欧美日韩国产经典色站一区二区三区| 精品国产网站在线观看| 视频一区中文字幕| 欧美日韩精品一区二区三区四区| 国产欧美一区二区精品秋霞影院 | 欧美二区三区的天堂| 亚洲欧美日韩在线| 精品一区免费av| 欧美一区二区三区视频在线观看| 日本免费新一区视频| 亚洲一区二区三区美女| 欧美三级资源在线| 日韩精品一区二区三区在线 | 国产乱码精品一区二区三区忘忧草 | 精品对白一区国产伦| 精品一区在线看| 色婷婷激情综合| 精品国产乱码久久久久久免费 | av电影一区二区| 一区二区三区在线观看国产| 夜夜操天天操亚洲| 亚洲国产成人高清精品| 精品少妇一区二区三区日产乱码 | 久久午夜色播影院免费高清 | 91免费小视频| 91精品啪在线观看国产60岁| 欧美激情一区二区三区不卡| 亚洲欧洲日韩综合一区二区| 成人网男人的天堂| 91精品国产色综合久久不卡电影| 国产日韩欧美一区二区三区乱码 | 欧美色综合网站| 成人精品一区二区三区中文字幕| 亚洲女与黑人做爰| 久久国产精品免费| 欧美日韩成人综合| 亚洲欧美日韩系列| 国产伦精品一区二区三区视频青涩 | 国产精品视频一二| 日韩欧美国产wwwww| 国产精品久久久久国产精品日日| 亚洲国产精品一区二区尤物区| 国产成人精品免费在线| 制服丝袜亚洲精品中文字幕| 中文字幕一区二区三区在线播放 | 91黄色激情网站| 国产婷婷一区二区| 男女男精品网站| 欧美视频完全免费看| 免费人成精品欧美精品| 91视频一区二区三区| 久久久91精品国产一区二区三区| 日韩不卡一区二区| 欧美日韩在线播放三区四区| 国产乱国产乱300精品| 国产盗摄精品一区二区三区在线| 欧美日韩国产高清一区| 亚洲高清久久久| 亚瑟在线精品视频| 欧美私模裸体表演在线观看| 亚洲精品一卡二卡| 色综合天天做天天爱| 亚洲精品日日夜夜| 天涯成人国产亚洲精品一区av| 91麻豆精品秘密| 亚洲精品福利视频网站| 欧美在线视频全部完| 粉嫩aⅴ一区二区三区四区五区| 中文在线资源观看网站视频免费不卡| 国产一区二区精品久久91| 亚洲国产精品t66y| 国产成人av在线影院| 日韩—二三区免费观看av| 中文字幕日本不卡| 91国偷自产一区二区开放时间 | 91久久国产综合久久| 亚洲婷婷国产精品电影人久久| 国产乱子伦视频一区二区三区 | 国产麻豆成人传媒免费观看| 美女诱惑一区二区| 亚洲欧美激情视频在线观看一区二区三区| 亚洲一二三区不卡| 88在线观看91蜜桃国自产| 日本欧美加勒比视频| 一本高清dvd不卡在线观看| 成人av在线播放网址| 尤物视频一区二区| 欧美一区二区播放| 成人晚上爱看视频| 欧美精品高清视频| 欧美欧美欧美欧美| 奇米影视在线99精品| 国产精品情趣视频| 欧美做爰猛烈大尺度电影无法无天| 日韩欧美一级特黄在线播放| 日韩精品一区在线| 91免费在线视频观看| 亚洲mv在线观看| 精品久久久三级丝袜| 99久久久国产精品免费蜜臀| 亚洲电影视频在线| 欧美成人福利视频| 色94色欧美sute亚洲线路一久| 日韩欧美在线观看一区二区三区| 日韩电影在线观看电影| 国产欧美日韩在线观看| 欧美三级视频在线观看| 韩国视频一区二区|