精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Fn FnMut FnOnce 傻傻分不清

開發(fā) 前端
同時(shí)閉包引用變量也是有優(yōu)先級(jí)的:優(yōu)先只讀借用,然后可變借用,最后轉(zhuǎn)移所有權(quán)。本篇文章看下,如何將閉包當(dāng)成參數(shù)或返回值。

[[415256]]

本文轉(zhuǎn)載自微信公眾號(hào)「董澤潤(rùn)的技術(shù)筆記」,作者董澤潤(rùn)。轉(zhuǎn)載本文請(qǐng)聯(lián)系董澤潤(rùn)的技術(shù)筆記公眾號(hào)。

同時(shí)閉包引用變量也是有優(yōu)先級(jí)的:優(yōu)先只讀借用,然后可變借用,最后轉(zhuǎn)移所有權(quán)。本篇文章看下,如何將閉包當(dāng)成參數(shù)或返回值

Go 閉包調(diào)用

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func test(f func()) { 
  6.     f() 
  7.     f() 
  8.  
  9. func main() { 
  10.     a:=1 
  11.     fn := func() { 
  12.         a++ 
  13.         fmt.Printf("a is %d\n", a) 
  14.     } 
  15.     test(fn) 

上面是 go 的閉包調(diào)用,我們把 fn 當(dāng)成參數(shù),傳給函數(shù) test. 閉包捕獲變量 a, 做自增操作,同時(shí)函數(shù) fn 可以調(diào)用多次

對(duì)于熟悉 go 的人來說,這是非常自然的,但是換成 rust 就有問題了

  1. fn main() { 
  2.     let s = String::from("wocao"); 
  3.     let f = || {println!("{}", s);}; 
  4.     f(); 

比如上面這段 rust 代碼,我如果想把閉包 f 當(dāng)成參數(shù)該怎么寫呢?上周分享的閉包我們知道,閉包是匿名的

  1. c = hello_cargo::main::closure-2 (0x7fffffffe0e0, 0x7fffffffe0e4) 
  2. b = hello_cargo::main::closure-1 (0x7fffffffe0e0) 
  3. a = hello_cargo::main::closure-0 

在運(yùn)行時(shí),類似于上面的結(jié)構(gòu)體,閉包結(jié)構(gòu)體命名規(guī)則 closure-xxx, 同時(shí)我們是不知道函數(shù)簽名的

引出 Trait

官方文檔 給出了方案,標(biāo)準(zhǔn)庫提供了幾個(gè)內(nèi)置的 trait, 一個(gè)閉包一定實(shí)現(xiàn)了 Fn, FnMut, FnOnce 其中一個(gè),然后我們可以用泛型 + trait 的方式調(diào)用閉包

  1. $ cat src/main.rs 
  2. fn test<T>(f: T) where 
  3.     T: Fn() 
  4.     f(); 
  5.  
  6. fn main() { 
  7.     let s = String::from("董澤潤(rùn)的技術(shù)筆記"); 
  8.     let f = || {println!("{}", s);}; 
  9.     test(f); 
  10.  
  11. $ cargo run 
  12.     Finished dev [unoptimized + debuginfo] target(s) in 0.00s 
  13.      Running `target/debug/hello_cargo` 
  14. 董澤潤(rùn)的技術(shù)筆記 

上面將閉包 f 以泛型參數(shù)的形式傳給了函數(shù) test, 因?yàn)殚]包實(shí)現(xiàn)了 Fn trait. 剛學(xué)這塊的人可能會(huì)糊涂,其實(shí)可以理解類比 go interface, 但本質(zhì)還是不一樣的

  1. let f = || {s.push_str("不錯(cuò)");}; 

假如 test 聲明不變,我們的閉包修改了捕獲的變量呢?

  1. |     let f = || {s.push_str("不錯(cuò)");}; 
  2. |             ^^  - closure is `FnMut` because it mutates the variable `s` here 
  3. |             | 
  4. |             this closure implements `FnMut`, not `Fn` 
  5. |     test(f); 

報(bào)錯(cuò)說 closure 實(shí)現(xiàn)的 trait 是 FnMut, 而不是 Fn

  1. fn test<T>(mut f: T) where 
  2.     T: FnMut() 
  3.     f(); 
  4.  
  5. fn main() { 
  6.     let mut s = String::from("董澤潤(rùn)的技術(shù)筆記"); 
  7.     let f = || {s.push_str("不錯(cuò)");}; 
  8.     test(f); 

上面是可變借用的場(chǎng)景,我們?cè)倏匆幌?move 所有權(quán)的情況

  1. fn test<T>(f: T) where 
  2.     T: FnOnce() 
  3.     f(); 
  4.  
  5. fn main() { 
  6.     let s = String::from("董澤潤(rùn)的技術(shù)筆記"); 
  7.     let f = || {let _ = s;}; 
  8.     test(f); 

上面我們把自由變量 s 的所有權(quán) move 到了閉包里,此時(shí) T 泛型的特征變成了 FnOnce, 表示只能執(zhí)行一次。那如果 test 調(diào)用閉包兩次呢?

  1. 1 | fn test<T>(f: T) where 
  2.   |            - move occurs because `f` has type `T`, which does not implement the `Copy` trait 
  3. ... 
  4. 4 |     f(); 
  5.   |     --- `f` moved due to this call 
  6. 5 |     f(); 
  7.   |     ^ value used here after move 
  8.   | 
  9. note: this value implements `FnOnce`, which causes it to be moved when called 
  10.  --> src/main.rs:4:5 
  11.   | 
  12. 4 |     f(); 

編譯器提示第一次調(diào)用的時(shí)候,己經(jīng) move 了,再次調(diào)用無法訪問。很明顯此時(shí)自由變量己經(jīng)被析構(gòu)了 let _ = s; 離開詞法作用域就釋放了,rust 為了內(nèi)存安全當(dāng)然不允許繼續(xù)訪問

  1. fn test<T>(f: T) where 
  2.     T: Fn() 
  3.     f(); 
  4.     f(); 
  5.  
  6. fn main() { 
  7.     let s = String::from("董澤潤(rùn)的技術(shù)筆記"); 
  8.     let f = move || {println!("s is {}", s);}; 
  9.     test(f); 
  10.     //println!("{}", s); 

那么上面的代碼例子, 是否可以運(yùn)行呢?當(dāng)然啦,此時(shí)變量 s 的所有權(quán) move 給了閉包 f, 生命周期同閉包,反復(fù)調(diào)用也沒有副作用

深入理解

本質(zhì)上 Rust 為了內(nèi)存安全,才引入這么麻煩的處理。平時(shí)寫 go 程序,誰會(huì)在乎對(duì)象是何時(shí)釋放,對(duì)象是否存在讀寫沖突呢?總得有人來做這個(gè)事情,Rust 選擇在編譯期做檢查

  • FnOnce consumes the variables it captures from its enclosing scope, known as the closure’s environment. To consume the captured variables, the closure must take ownership of these variables and move them into the closure when it is defined. The Once part of the name represents the fact that the closure can’t take ownership of the same variables more than once, so it can be called only once.
  • FnMut can change the environment because it mutably borrows values.
  • Fn borrows values from the environment immutably.

上面來自官網(wǎng)的解釋,F(xiàn)n 代表不可變借用的閉包,可重復(fù)執(zhí)行,F(xiàn)nMut 代表閉包可變引用修改了變量,可重復(fù)執(zhí)行 FnOnce 代表轉(zhuǎn)移了所有權(quán),同時(shí)只能執(zhí)行一次,再執(zhí)行的話自由變量脫離作用域回收了

  1. # mod foo { 
  2. pub trait Fn<Args> : FnMut<Args> { 
  3.     extern "rust-call" fn call(&self, args: Args) -> Self::Output
  4.  
  5. pub trait FnMut<Args> : FnOnce<Args> { 
  6.     extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output
  7.  
  8. pub trait FnOnce<Args> { 
  9.     type Output
  10.  
  11.     extern "rust-call" fn call_once(self, args: Args) -> Self::Output
  12. # } 

上面是標(biāo)準(zhǔn)庫中,F(xiàn)n, FnMut, FnOnce 的實(shí)現(xiàn)??梢钥吹?Fn 繼承自 FnMut, FnMut 繼承自 FnOnce

  1. Fn(u32) -> u32 

前文例子都是無參數(shù)的,其實(shí)還可以帶上參數(shù)

由于 Fn 是繼承自 FnMut, 那么我們把實(shí)現(xiàn) Fn 的閉包傳給 FnMut 的泛型可以嘛?

  1. $ cat src/main.rs 
  2. fn test<T>(mut f: T) where 
  3.     T: FnMut() 
  4.     f(); 
  5.     f(); 
  6.  
  7. fn main() { 
  8.     let s = String::from("董澤潤(rùn)的技術(shù)筆記"); 
  9.     let f = || {println!("s is {}", s);}; 
  10.     test(f); 
  1. $ cargo run 
  2.    Compiling hello_cargo v0.1.0 (/Users/zerun.dong/code/rusttest/hello_cargo) 
  3.     Finished dev [unoptimized + debuginfo] target(s) in 1.47s 
  4.      Running `target/debug/hello_cargo` 
  5. is 董澤潤(rùn)的技術(shù)筆記 
  6. is 董澤潤(rùn)的技術(shù)筆記 

當(dāng)然可以看起來沒有問題,F(xiàn)nMut 告訴函數(shù) test 這是一個(gè)會(huì)修改變量的閉包,那么傳進(jìn)來的閉包不修改當(dāng)然也沒問題

上圖比較出名,由于有繼承關(guān)系,實(shí)現(xiàn) Fn 可用于 FnMut 和 FnOnce 參數(shù),實(shí)現(xiàn) FnMut 可用于 FnOnce 參數(shù)

函數(shù)指針

  1. fn call(f: fn()) {    // function pointer 
  2.     f(); 
  3.  
  4. fn main() { 
  5.     let a = 1; 
  6.  
  7.     let f = || println!("abc");     // anonymous function 
  8.     let c = || println!("{}", &a);  // closure 
  9.  
  10.     call(f); 
  11.     call(c); 

函數(shù)和閉包是不同的,上面的例子中 f 是一個(gè)匿名函數(shù),而 c 引用了自由變量,所以是閉包。這段代碼是不能執(zhí)行的

  1. 9  |     let c = || println!("{}", &a);  // closure 
  2.    |             --------------------- the found closure 
  3. ... 
  4. 12 |     call(c); 
  5.    |          ^ expected fn pointer, found closure 

編譯器告訴我們,12 行要求參數(shù)是函數(shù)指針,不應(yīng)該是閉包

閉包作為返回值

參考 impl Trait 輕松返回復(fù)雜的類型,impl Trait 是指定實(shí)現(xiàn)特定特征的未命名但有具體類型的新方法。你可以把它放在兩個(gè)地方:參數(shù)位置和返回位置

  1. fn returns_closure() -> Box<dyn Fn(i32) -> i32> { 
  2.     Box::new(|x| x + 1) 
  3.  
  4. fn main() { 
  5.     let f = returns_closure(); 
  6.     println!("res is {}", f(11)); 

在以前,從函數(shù)處返回閉包的唯一方法是,使用 trait 對(duì)象,大家可以試試不用 Box 裝箱的報(bào)錯(cuò)提示

  1. fn returns_closure() -> impl Fn(i32) -> i32 { 
  2.     |x| x + 1 
  3.  
  4. fn main() { 
  5.     let f = returns_closure(); 
  6.     println!("res is {}", f(11)); 

現(xiàn)在我們可以用 impl 來實(shí)現(xiàn)閉包的返回值聲明

  1. fn test() -> impl FnMut(char) { 
  2.     let mut s = String::from("董澤潤(rùn)的技術(shù)筆記"); 
  3.     |c| { s.push(c); } 
  4.  
  5. fn main() { 
  6.     let mut c = test(); 
  7.     c('d'); 
  8.     c('e'); 

來看一個(gè)和引用生命周期相關(guān)的例子,上面的代碼返回閉包 c, 對(duì)字符串 s 進(jìn)行追回作。代碼執(zhí)行肯定報(bào)錯(cuò):

  1.  --> src/main.rs:3:5 
  2.   | 
  3. 3 |     |c| { s.push(c); } 
  4.   |     ^^^   - `s` is borrowed here 
  5.   |     | 
  6.   |     may outlive borrowed value `s` 
  7.   | 
  8. note: closure is returned here 
  9.  --> src/main.rs:1:14 
  10.   | 
  11. 1 | fn test() -> impl FnMut(char) { 
  12.   |              ^^^^^^^^^^^^^^^^ 
  13. help: to force the closure to take ownership of `s` (and any other referenced variables), use the `move` keyword 
  14.   | 
  15. 3 |     move |c| { s.push(c); } 
  16.   |     ^^^^^^^^ 

提示的很明顯,變量 s 脫離作用域就釋放了,編譯器也提示我們要 move 所有權(quán)給閉包,感興趣的自己修改測(cè)試一下

 

責(zé)任編輯:武曉燕 來源: 董澤潤(rùn)的技術(shù)筆記
相關(guān)推薦

2022-05-05 13:54:37

SPI機(jī)制APISPI

2021-01-22 08:37:02

二進(jìn)制Binary SemaReentrant L

2021-10-06 23:31:45

HibernateJPASpring Data

2021-05-09 21:57:08

數(shù)據(jù)倉(cāng)庫Olap

2021-03-23 10:45:23

CookieSession前端

2021-03-10 08:56:37

Zookeeper

2021-07-27 07:31:16

JavaArrayList數(shù)組

2022-05-15 21:52:04

typeTypeScriptinterface

2021-08-02 12:50:45

sessiontokenJava

2024-02-29 09:08:56

Encoding算法加密

2020-10-30 08:20:04

SD卡TF卡存儲(chǔ)

2019-06-18 09:45:19

正向代理反向代理IT

2022-04-15 11:47:47

LVSNginx負(fù)載均衡

2018-12-17 12:30:05

Kubernetes存儲(chǔ)存儲(chǔ)卷

2018-05-22 16:24:20

HashMapJavaJDK

2020-03-03 17:35:09

Full GCMinor

2025-08-18 03:25:00

2015-02-28 10:01:00

云計(jì)算IT架構(gòu)虛擬化

2023-02-27 15:46:19

數(shù)據(jù)元元數(shù)據(jù)

2023-09-03 21:18:07

Python編程語言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美经典一区二区三区| 国产精品色在线网站| 国产欧美中文在线| 国产成人亚洲精品| 无码国产精品一区二区免费式直播| 性国产高清在线观看| 成人免费毛片app| 91精品国产色综合久久不卡98口 | 性久久久久久| 亚洲欧美www| 鲁一鲁一鲁一鲁一av| 久久精品视频观看| 成人夜色视频网站在线观看| 欧美在线视频观看| 四虎地址8848| youjizz亚洲| 91成人在线免费观看| 欧美精品七区| 97成人免费视频| 99riav1国产精品视频| 在线观看精品国产视频| 日本一级大毛片a一| 日韩欧美一区二区三区在线观看 | 久久久久中文字幕亚洲精品| 综合日韩av| 亚洲色图欧美在线| 欧美日韩在线一区| 国产亚洲精品激情久久| 欧美精品久久久久久久久25p| а√天堂在线官网| 99久久99久久久精品齐齐| 国产精品第一页在线| 日日骚一区二区三区| 国产一区日韩| 亚洲大胆人体av| 鲁一鲁一鲁一鲁一av| 羞羞视频在线观看免费| 久久久不卡影院| 99视频网站| 中文字幕人妻互换av久久| 激情亚洲成人| 日韩中文字幕亚洲| av男人的天堂av| 亚洲日本视频在线| 欧美日韩国产美| 日本一区二区黄色| 国产理论电影在线| 亚洲欧洲精品一区二区三区不卡| 精品国产一区二区三区麻豆小说| 国产乱人乱偷精品视频a人人澡| 亚洲午夜一区| 久久视频在线观看免费| 国产精久久一区二区三区| 久久精品国产亚洲av麻豆色欲| 国产乱子精品一区二区在线观看| 亚洲成a人片在线观看中文| 一区二区三区四区视频在线观看 | 国产欧美一区二区视频 | 1769视频在线播放免费观看| 激情国产一区二区| 国产精品欧美亚洲777777| 一级做a爰片久久毛片| 亚洲三级色网| 欧美激情网友自拍| 激情视频在线播放| 欧美不卡一区| 欧美噜噜久久久xxx| 精品无码在线观看| 欧美午夜精彩| 在线观看国产精品淫| 日本成人午夜影院| 精品国产91| 伊人伊人伊人久久| 日本污视频网站| www.5588.com毛片| 91亚洲精品| 91成人在线观看喷潮| chinese少妇国语对白| 大胆人体一区二区| 色婷婷av一区二区三区之一色屋| 国语对白做受xxxxx在线中国 | 国产+人+亚洲| 日韩免费在线视频观看| 亚洲精选一区| 日本中文字幕成人| 欧美 亚洲 另类 激情 另类| 美女视频一区在线观看| 成人激情免费在线| 亚洲高清视频网站| 91网址在线看| 欧美二区在线| 尤物网址在线观看| 亚洲视频在线一区观看| 国产毛片久久久久久国产毛片| 草草影院在线| 91福利在线观看| 午夜一区二区视频| 亚洲二区av| 精品88久久久久88久久久 | 日本欧美一区二区在线观看| 国产精品中文久久久久久久| 99精品人妻无码专区在线视频区| 国产成人av电影| 久久一区二区三区av| 国产区av在线| 亚洲人亚洲人成电影网站色| 国产在线播放观看| av一区在线播放| 日韩一区二区三区免费观看| 中文字幕人妻一区二区三区| 国产尤物久久久| 欧美精品情趣视频| 久热国产精品视频一区二区三区| 91香蕉视频污在线观看| 欧美精品入口| 国产精品久久久久久婷婷天堂| 99久久精品国产一区二区成人| av在线不卡观看免费观看| 色播亚洲视频在线观看| 国产99re66在线视频| 色综合天天天天做夜夜夜夜做| 国产精品久久久久久9999| 丝袜久久网站| zzjj国产精品一区二区| 少妇高潮av久久久久久| 国产福利一区二区三区| 视频一区二区在线| free性m.freesex欧美| 欧美日韩精品一区二区三区蜜桃| 人妻av一区二区| 日韩精品第一区| 欧美亚洲另类视频| 手机在线观看毛片| 性久久久久久久久久久久| 欧美性猛交xx| 欧美jjzz| 97人人干人人| 污污片在线免费视频| 4438成人网| 免费黄色国产视频| 久久99国内精品| 亚洲一区精品视频| 国模私拍国内精品国内av| 国产一区二区成人| 国产精品第6页| 亚洲国产精品成人久久综合一区| 国产97色在线 | 日韩| 国产精品免费不| 青青草一区二区| 国产最新视频在线观看| 色菇凉天天综合网| 黄色av免费播放| 老司机精品视频一区二区三区| 色综合久久av| 亚洲我射av| 欧美成人午夜免费视在线看片| 91丨九色丨丰满| 亚洲欧美日韩国产手机在线 | 精品视频在线导航| 丰满少妇xoxoxo视频| 国产无人区一区二区三区| 妺妺窝人体色www在线观看| 欧美丝袜激情| 成人欧美在线视频| 国产精品一区hongkong| 日韩高清av一区二区三区| 青青草免费观看视频| 国产女主播视频一区二区| 国产嫩草在线观看| 久久久9色精品国产一区二区三区| 91精品一区二区| 免费看电影在线| 国产视频丨精品|在线观看| 欧美日韩 一区二区三区| 国产精品无码永久免费888| 中文字幕日韩综合| 在线看片一区| 日韩精品伦理第一区| 国产精久久久| 国外色69视频在线观看| 国产专区在线| 欧美一区二区三区在线观看| 九九热国产视频| 国产精品三级久久久久三级| 日韩欧美色视频| 亚洲一区图片| 欧美三级午夜理伦三级老人| 欧美日韩精品一区二区三区在线观看| 国产91在线播放九色快色| 黄色av免费在线| 亚洲精品久久久久久久久久久久| 青青国产在线视频| 一区二区三区日韩精品| 真实乱视频国产免费观看| 国产福利一区二区三区视频在线 | 精品深夜av无码一区二区老年| 91在线高清观看| 国产精品久久久久久久99| 羞羞答答国产精品www一本| 中国老女人av| 国产一区网站| 激情欧美一区二区三区中文字幕| 国产91精品在线| 68精品久久久久久欧美| 成人午夜在线影视| 一区二区三区在线播放欧美| 高h放荡受浪受bl| 欧美色视频一区| 国产精品久久久久久久久久久久久久久久久| 18涩涩午夜精品.www| 精品无码人妻一区| 粉嫩av亚洲一区二区图片| 手机av在线免费| 日韩精品亚洲专区| 欧美国产激情视频| 国产一区视频在线观看免费| 亚洲人成人77777线观看| 在线日韩一区| 国产偷国产偷亚洲高清97cao| 国产精品毛片无码| 国产精品网站大全| 电影亚洲精品噜噜在线观看| 97超碰蝌蚪网人人做人人爽| 激情av在线播放| 成人97在线观看视频| 色网站免费在线观看| 国产一区二区三区在线视频 | 亚洲三级av| 91视频九色网站| 亚洲三级电影| 国产日韩精品在线观看| 欧美日韩精品免费观看视欧美高清免费大片| 久久久免费av| 免费在线看污片| 欧美日韩国产成人在线| free性欧美hd另类精品| 久久精品中文字幕一区| 在线免费av网站| 中文字幕日韩视频| 在线视频二区| 日韩有码在线播放| 日韩成人影视| 波霸ol色综合久久| 思思99re6国产在线播放| 一区二区三区四区精品| seseavlu视频在线| 搡老女人一区二区三区视频tv| 五月婷婷在线视频| 美女福利视频一区| 毛片在线网址| 国模私拍一区二区三区| 一二三四视频在线中文| 欧美一级高清免费| 91精品影视| 91精品久久久久久久久久| 国产激情一区| 国产亚洲一区在线播放| 亚洲美女久久| 亚洲精品人成| 欧美精品二区| 大陆极品少妇内射aaaaa| 丝袜美腿一区二区三区| 91制片厂毛片| 国产一区二区三区高清播放| 在线观看成人动漫| 久久中文字幕电影| 国产视频123区| 一区二区三区在线观看视频| 国产成人无码精品久久久久| 91久久国产最好的精华液| 正在播放木下凛凛xv99| 欧美一区二区三区精品| 午夜视频免费在线| 国产亚洲欧美日韩美女| 欧美videos极品另类| 欧美日韩第一视频| 成人性生交大片免费观看网站| 国产精品影片在线观看| 日韩在线视频一区二区三区| 狠狠爱一区二区三区| 成人vr资源| 久久这里只有精品18| 久久精品在线| 国产资源中文字幕| 久久亚洲精华国产精华液| 日韩精品久久久久久久的张开腿让| 亚洲综合免费观看高清完整版| 国产又爽又黄的视频| 欧美人妖巨大在线| 国产 欧美 精品| 国产亚洲精品激情久久| 日本三级韩国三级欧美三级| 国产97在线观看| 日韩精品一区二区三区中文字幕| 久久免费99精品久久久久久| 一区二区免费不卡在线| 欧美a在线视频| 国产成人免费视频精品含羞草妖精| 亚欧洲乱码视频| 一区二区三区精品视频| 懂色av蜜臀av粉嫩av喷吹| 亚洲国产黄色片| 91亚洲天堂| 国产精品免费一区豆花| 秋霞在线一区| 男人的天堂视频在线| 日本视频一区二区| 91av在线免费| 一区二区三区免费| 国产精品伦理一区| 一区二区亚洲精品国产| 色戒汤唯在线观看| 国产精品日韩一区二区| 亚洲精品97| 天天干在线影院| 99精品热视频| 国产在线视频99| 日韩一区二区三区av| aaa在线观看| 日本韩国在线不卡| 日本欧美高清| 亚洲色成人www永久在线观看 | 亚洲美女啪啪| 久久无码专区国产精品s| 1区2区3区国产精品| 在线视频1卡二卡三卡| 在线日韩日本国产亚洲| 新版的欧美在线视频| 国产精品视频入口| 亚洲视频免费| 在线中文字日产幕| 天天在线女人的天堂视频| 免费国产自线拍一欧美视频| 91精品在线免费观看| 久蕉依人在线视频| 55夜色66夜色国产精品视频| 波多野结衣在线一区二区| 路边理发店露脸熟妇泻火| 强制捆绑调教一区二区| 欧美福利第一页| 欧美性一二三区| yjizz视频网站在线播放| 国产精品久久久久77777| 欧洲视频一区| 午夜视频你懂的| 国产精品人妖ts系列视频| 中文字幕在线日亚洲9| 中文字幕欧美日韩va免费视频| 精品176极品一区| 亚洲一区三区电影在线观看| 精品中文字幕一区二区小辣椒| 日本中文在线视频| 日韩一级大片在线观看| 久久青青色综合| 精品免费国产| 久久亚洲二区| 女教师淫辱の教室蜜臀av软件| 4hu四虎永久在线影院成人| 伊人电影在线观看| 狠狠色综合欧美激情| 一区二区三区四区五区在线| 谁有免费的黄色网址| 欧美日韩一区二区在线视频| 久操视频在线免费播放| 91手机在线观看| 国产一区二区三区久久久久久久久| 91精品人妻一区二区| 欧美日韩国产在线播放网站| 麻豆视频在线免费观看| 99久久精品无码一区二区毛片 | 精品国产一区二区三区四区在线观看| 在线欧美激情| 日本福利视频一区| 国产香蕉久久精品综合网| 国产又粗又黄又爽| 亚洲91精品在线观看| 精品国产一区二区三区| 色偷偷中文字幕| 黄色精品一区二区| 91caoporn在线| 国产精品二区在线观看| 久热精品在线| 超碰手机在线观看| 亚洲国产日韩精品在线| 日本午夜精品久久久久| avav在线播放| 欧美国产日韩在线观看| 亚洲欧美黄色片| 国产精品男人爽免费视频1| 黄色亚洲在线| 羞羞在线观看视频| 日韩大片免费观看视频播放| 小说区图片区亚洲| 成人在线免费在线观看| 日韩理论片中文av| 青青青手机在线视频观看| 亚洲最大av网| 青椒成人免费视频| 欧美一区二区三区四| 精品自在线视频|