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

在 Rust 編程中使用泛型

開發
本文的內容將涉及泛型定義函數、結構體、枚舉和方法, 還將討論泛型如何影響代碼性能。

1.摘要

Rust中的泛型可以讓我們為像函數簽名或結構體這樣的項創建定義, 這樣它們就可以用于多種不同的具體數據類型。下面的內容將涉及泛型定義函數、結構體、枚舉和方法, 還將討論泛型如何影響代碼性能。

2.在函數定義中使用泛型

當使用泛型定義函數時,本來在函數簽名中指定參數和返回值的類型的地方,會改用泛型來表示。采用這種技術,使得代碼適應性更強,從而為函數的調用者提供更多的功能,同時也避免了代碼的重復。

看下面的代碼例子, 定義了兩個函數, 功能都差不多,作用是分別尋找slice中最大的i32和slice中最大的char, 只是數據類型不同。

fn largest_i32(list: &[i32]) -> &i32 {
    let mut largest = &list[0];

    for item in list {
        if item > largest {
            largest = item;
        }
    }

    largest
}

fn largest_char(list: &[char]) -> &char {
    let mut largest = &list[0];

    for item in list {
        if item > largest {
            largest = item;
        }
    }

    largest
}

fn main() {
    let number_list = vec![34, 50, 25, 100, 65];

    let result = largest_i32(&number_list);
    println!("The largest number is {}", result);

    let char_list = vec!['y', 'm', 'a', 'q'];

    let result = largest_char(&char_list);
    println!("The largest char is {}", result);
}

編譯一下代碼, 輸出如下:

我們現在需要定義一個新函數, 引進泛型參數來消除這種因數據類型不同而導致的函數重復定義。為了參數化這個新函數中的這些類型,我們需要為類型參數命名,道理和給函數的形參起名一樣。任何標識符都可以作為類型參數的名字。這里選用 T,因為傳統上來說,Rust 的類型參數名字都比較短,通常僅為一個字母,同時,Rust 類型名的命名規范是首字母大寫駝峰式命名法(UpperCamelCase)。T 作為 “type” 的縮寫是大部分 Rust 程序員的首選。

如果要在函數體中使用參數,就必須在函數簽名中聲明它的名字,好讓編譯器知道這個名字指代的是什么。同理,當在函數簽名中使用一個類型參數時,必須在使用它之前就聲明它。為了定義泛型版本的 largest 函數,類型參數聲明位于函數名稱與參數列表中間的尖括號 <> 中,像這樣:

fn largest<T>(list: &[T]) -> &T

可以這樣理解這個定義:函數 largest 有泛型類型 T。它有個參數 list,其類型是元素為 T 的 slice。largest 函數會返回一個與 T 相同類型的引用。

按照這個思想, 我們將代碼改造如下:

fn largest<T>(list: &[T]) -> &T {
    let mut largest = &list[0];

    for item in list {
        if item > largest {
            largest = item;
        }
    }

    largest
}

fn main() {
    let number_list = vec![34, 50, 25, 100, 65];

    let result = largest(&number_list);
    println!("The largest number is {}", result);

    let char_list = vec!['y', 'm', 'a', 'q'];

    let result = largest(&char_list);
    println!("The largest char is {}", result);
}

一切似乎很順利, 嘗試編譯這段代碼, 編譯器結果如下:

這次編譯沒有通過的原因Rust編譯器用綠色標識出來了, 缺少一個: std:cmp::PartialOrd, 先暫且認為這個是Rust標準庫要求的東西, 加上重新編譯一下試試:

fn largest<T: std::cmp::PartialOrd>(list: &[T]) -> &T {
    let mut largest = &list[0];

    for item in list {
        if item > largest {
            largest = item;
        }
    }

    largest
}

重新編譯結果如下:

我們在代碼中下了一個斷點, 能夠執行到此處說明代碼已經沒有問題。實際上上面這個錯誤表明 largest 的函數體不能適用于 T 的所有可能的類型。因為在函數體需要比較 T 類型的值,不過它只能用于我們知道如何排序的類型。為了開啟比較功能,標準庫中定義的 std::cmp::PartialOrd trait 可以實現類型的比較功能, 我們限制 T 只對實現了 PartialOrd 的類型有效后代碼就可以編譯了,因為標準庫為 i32 和 char 實現了 PartialOrd。

3.在結構體中使用泛型

同樣也可以用 <> 語法來定義結構體,它包含一個或多個泛型參數類型字段。下面的代碼片段定義了一個可以存放任何類型的 x 和 y 坐標值的結構體 Point:

struct Point<T> {
    x: T,
    y: T,
}

fn main() {
    let integer = Point { x: 5, y: 10 };
    let float = Point { x: 1.0, y: 4.0 };
}

其語法類似于函數定義中使用泛型。首先,必須在結構體名稱后面的尖括號中聲明泛型參數的名稱。接著在結構體定義中可以指定具體數據類型的位置使用泛型類型。

注意 Point<T> 的定義中只使用了一個泛型類型,這個定義表明結構體 Point<T> 對于一些類型 T 是泛型的,而且字段 x 和 y 都是 相同類型的,無論它具體是何類型。

如果嘗試創建一個有不同類型值的 Point<T> 的實例, 看下面的代碼:

struct Point<T> {
    x: T,
    y: T,
}

fn main() {
    let wont_work = Point { x: 5, y: 4.0 };
}

在這個例子中,當把整型值 5 賦值給 x 時,就告訴了編譯器這個 Point<T> 實例中的泛型 T 全是整型。接著指定 y 為浮點值 4.0,因為它y被定義為與 x 相同類型,所以將會得到一個像這樣的類型不匹配錯誤:

如果想要定義一個 x 和 y 可以有不同類型且仍然是泛型的 Point 結構體,我們可以使用多個泛型類型參數。修改 Point 的定義為擁有兩個泛型類型 T 和 U。其中字段 x 是 T 類型的,而字段 y 是 U 類型的:

struct Point<T, U> {
    x: T,
    y: U,
}

fn main() {
    let both_integer = Point { x: 5, y: 10 };
    let both_float = Point { x: 1.0, y: 4.0 };
    let integer_and_float = Point { x: 5, y: 4.0 };
}

現在所有這些 Point 實例都合法了!我們可以在定義中使用任意多的泛型類型參數,不過太多的話,代碼將難以閱讀和理解。當你發現代碼中需要很多泛型時,這可能表明你的代碼需要重構分解成更小的結構。

4.枚舉中使用泛型

和結構體類似,枚舉也可以在成員中存放泛型數據類型。例如:

enum Option<T> {
    Some(T),
    None,
}

Option<T> 是一個擁有泛型 T 的枚舉,它有兩個成員:Some,它存放了一個類型 T 的值,和不存在任何值的None。通過 Option<T> 枚舉可以表達有一個可能的值的抽象概念,同時因為 Option<T> 是泛型的,無論這個可能的值是什么類型都可以使用這個抽象。

枚舉也可以擁有多個泛型類型, 例如:

enum Result<T, E> {
    Ok(T),
    Err(E),
}

Result 枚舉有兩個泛型類型,T 和 E。Result 有兩個成員:Ok,它存放一個類型 T 的值,而 Err 則存放一個類型 E 的值。這個定義使得 Result 枚舉能很方便的表達任何可能成功(返回 T 類型的值)也可能失敗(返回 E 類型的值)的操作。

總結:當意識到代碼中定義了多個結構體或枚舉,它們不一樣的地方只是其中的值的類型的時候,不妨通過泛型類型來避免重復。

5.方法定義中的泛型

在為結構體和枚舉實現方法時, 一樣也可以用泛型。看下面的代碼:

struct Point<T> {
    x: T,
    y: T,
}

impl<T> Point<T> {
    fn x(&self) -> &T {
        &self.x
    }
}

fn main() {
    let p = Point { x: 5, y: 10 };

    println!("p.x = {}", p.x());
}

這里在 Point<T> 上定義了一個叫做 x 的方法來返回字段 x 中數據的引用。注意必須在 impl 后面聲明 T,這樣就可以在 Point<T> 上實現的方法中使用 T 了。通過在 impl 之后聲明泛型 T,Rust 就知道 Point 的尖括號中的類型是泛型而不是具體類型。我們可以為泛型參數選擇一個與結構體定義中聲明的泛型參數所不同的名稱,不過依照慣例使用了相同的名稱。impl 中編寫的方法聲明了泛型類型可以定位為任何類型的實例,不管最終替換泛型類型的是何具體類型。

定義方法時也可以為泛型指定限制(constraint)。例如,可以選擇為 Point<f32> 實例實現方法,而不是為泛型 Point 實例。代碼如下:

impl Point<f32> {
    fn distance_from_origin(&self) -> f32 {
        (self.x.powi(2) + self.y.powi(2)).sqrt()
    }
}

這段代碼意味著 Point<f32> 類型會有一個方法 distance_from_origin,而其他 T 不是 f32 類型的 Point<T> 實例則沒有定義此方法。這個方法計算點實例與坐標 (0.0, 0.0) 之間的距離,并使用了只能用于浮點型的數學運算符。

結構體定義中的泛型類型參數并不總是與結構體方法簽名中使用的泛型是同一類型。看下面的代碼:

struct Point<X1, Y1> {
    x: X1,
    y: Y1,
}

impl<X1, Y1> Point<X1, Y1> {
    fn mixup<X2, Y2>(self, other: Point<X2, Y2>) -> Point<X1, Y2> {
        Point {
            x: self.x,
            y: other.y,
        }
    }
}

fn main() {
    let p1 = Point { x: 5, y: 10.4 };
    let p2 = Point { x: "Hello", y: 'c' };

    let p3 = p1.mixup(p2);

    println!("p3.x = {}, p3.y = {}", p3.x, p3.y);
}

在上面的代碼中, Point 結構體使用了泛型類型 X1 和 Y1,為 mixup 方法簽名使用了 X2 和 Y2 來使得示例更加清楚。這個方法用 self 的 Point 類型的 x 值(類型 X1)和參數的 Point 類型的 y 值(類型 Y2)來創建一個新 Point 類型的實例

在 main 函數中,定義了一個有 i32 類型的 x(其值為 5)和 f64 的 y(其值為 10.4)的 Point。p2 則是一個有著字符串 slice 類型的 x(其值為 "Hello")和 char 類型的 y(其值為c)的 Point。在 p1 上以 p2 作為參數調用 mixup 會返回一個 p3,它會有一個 i32 類型的 x,因為 x 來自 p1,并擁有一個 char 類型的 y,因為 y 來自 p2。println! 會打印出 p3.x = 5, p3.y = c。

這個例子的目的是展示一些泛型通過 impl 聲明而另一些通過方法定義聲明的情況。這里泛型參數 X1 和 Y1 聲明于 impl 之后,因為它們與結構體定義相對應。而泛型參數 X2 和 Y2 聲明于 fn mixup 之后,因為它們只是相對于方法本身的。

6.泛型代碼性能

不用擔心使用泛型會比使用具體類型的代碼性能低。

Rust 通過在編譯時進行泛型代碼的 單態化(monomorphization)來保證效率。單態化是一個通過填充編譯時使用的具體類型,將通用代碼轉換為特定代碼的過程。

在這個過程中,編譯器尋找所有泛型代碼被調用的位置并使用泛型代碼針對具體類型生成代碼。

下面看看這個怎樣用于標準庫中的 Option 枚舉:

let integer = Some(5);
let float = Some(5.0);

當 Rust 編譯這些代碼的時候,它會進行單態化。編譯器會讀取傳遞給 Option<T> 的值并發現有兩種 Option<T>:一個對應 i32 另一個對應 f64。為此,它會將泛型定義 Option<T> 展開為兩個針對 i32 和 f64 的定義,接著將泛型定義替換為這兩個具體的定義。

編譯器生成的單態化版本的代碼看起來像這樣(編譯器會使用不同于如下假想的名字):

enum Option_i32 {
    Some(i32),
    None,
}

enum Option_f64 {
    Some(f64),
    None,
}

fn main() {
    let integer = Option_i32::Some(5);
    let float = Option_f64::Some(5.0);
}

泛型 Option<T> 被編譯器替換為了具體的定義。因為 Rust 會將每種情況下的泛型代碼編譯為具體類型,使用泛型沒有運行時開銷。當代碼運行時,它的執行效率就跟好像手寫每個具體定義的重復代碼一樣。這個單態化過程正是 Rust 泛型在運行時極其高效的原因。

責任編輯:趙寧寧 來源: 二進制空間安全
相關推薦

2024-01-07 17:29:10

編程語言線程Rust

2023-12-28 10:30:56

類型系統Rust

2023-01-05 17:13:28

TypeScript泛型組件

2023-06-15 17:00:11

Rust循環

2024-03-26 09:25:35

RustSerde重命名

2023-05-04 07:33:39

Rust變量常量

2021-03-22 08:45:30

異步編程Java

2020-11-13 07:19:45

元編程模型Java

2024-09-06 11:34:15

RustAI語言

2021-09-29 18:17:30

Go泛型語言

2024-02-07 11:44:20

NestJSRxJS異步編程

2011-12-08 10:24:53

JavaNIO

2024-04-07 00:00:10

Rust枚舉C代碼

2024-10-28 00:40:49

Go語法版本

2009-08-24 18:22:05

C# 泛型編程

2011-06-08 16:56:37

VS2008 Qt

2022-08-09 07:08:28

函數式編程Go

2009-04-24 09:33:12

LINQ查詢非泛型

2009-05-27 10:12:27

LINQ泛型字典Dictionary

2019-01-17 10:25:56

Python編程語言程序員
點贊
收藏

51CTO技術棧公眾號

少妇激情综合网| 欧美日韩国内自拍| 91香蕉国产在线观看| 欧美精品成人久久| 欧美大胆a级| 日本高清不卡视频| 三级在线免费观看| 天堂中文在线8| 免费观看在线综合| 精品中文字幕在线| 性欧美精品中出| 国产亚洲久久| 色综合久久久久综合体| 女同性恋一区二区| 免费在线高清av| 狠狠色2019综合网| 日本精品性网站在线观看| 麻豆网址在线观看| 神马久久一区二区三区| 日韩欧美一级二级三级久久久| av动漫在线观看| 动漫一区在线| 国产精品午夜免费| 国产一区二区三区奇米久涩 | 欧美日韩免费观看一区三区| 91免费黄视频| av免费看在线| 国产精品人成在线观看免费 | 欧美777四色影视在线| 国产一区二区三区日韩| 国产精品91一区| 亚洲黄色一区二区| 欧美国产专区| 久久亚洲私人国产精品va| 蜜臀久久99精品久久久久久| 全国精品免费看| 精品精品欲导航| 天天综合成人网| 精品久久在线| 欧美性感一类影片在线播放| 18禁免费无码无遮挡不卡网站| av网站大全在线| 亚洲欧洲精品成人久久奇米网| 欧洲亚洲一区二区三区四区五区| 免费a视频在线观看| 久草精品在线观看| 国产精品视频大全| 波多野结衣网站| 久久男女视频| 秋霞午夜一区二区| 国产中文字幕视频| 性一交一乱一区二区洋洋av| 97成人超碰免| 看片网址国产福利av中文字幕| 亚洲国产专区| 992tv在线成人免费观看| 国产真实的和子乱拍在线观看| 欧美激情综合| 欧美激情亚洲精品| 久草精品视频在线观看| 黄色成人在线网站| 性日韩欧美在线视频| 97人人澡人人爽人人模亚洲| 亚洲欧美日本国产专区一区| 日韩免费不卡av| 国产一卡二卡三卡| 蜜桃视频第一区免费观看| 国产日韩专区在线| 99国产成人精品| 国产精品99久| 国产一区福利视频| 暖暖视频在线免费观看| 欧美激情中文字幕一区二区| 在线视频福利一区| 午夜av在线免费观看| 亚洲一区二区三区四区在线观看| www.射射射| 中文日产幕无线码一区二区| 91国产视频在线观看| 五月婷婷激情久久| 麻豆视频久久| 日韩精品视频观看| 国产一二三四视频| 亚洲欧美一区在线| 热久久免费视频精品| 中文字字幕在线观看| 国产一区二区在线视频| 国产精品一区视频| 国产成人天天5g影院在线观看| 中文字幕在线播放不卡一区| av动漫在线免费观看| 91精品论坛| 91精品国产黑色紧身裤美女| 亚洲熟女乱综合一区二区三区| 精品国产91乱码一区二区三区四区| 日韩在线播放av| 精品无码免费视频| 久久一级免费视频| 精品一区二区三区中文字幕老牛| 色综合影院在线| 欧美一区二区三| 欧美一级高清片在线观看| 91精品国产高清91久久久久久 | 黄色精品视频| 欧美美女黄视频| xxxxxx黄色| 色婷婷一区二区三区| 97视频免费在线观看| 97超碰人人草| 久久青草欧美一区二区三区| 精品国产一区二区三区在线| 性欧美又大又长又硬| 69堂国产成人免费视频| 人妻精品久久久久中文字幕| 香港欧美日韩三级黄色一级电影网站| 97超级碰在线看视频免费在线看| 国产女人18毛片水真多| 国产视频一区在线播放| 阿v天堂2018| 精品国产亚洲一区二区三区| 亚洲日韩第一页| 日本亚洲欧美在线| 国产精品综合久久| 亚洲v日韩v欧美v综合| 国产精品原创| 欧美xxxx老人做受| 后入内射无码人妻一区| 久久蜜桃资源一区二区老牛| 国产一区二区三区奇米久涩| 污的网站在线观看| 91精品国产欧美一区二区成人| 欧美极品jizzhd欧美18| 嫩草成人www欧美| 精品无人区一区二区三区竹菊| 色呦呦久久久| 欧美不卡一区二区三区四区| 国产精品成人69xxx免费视频 | 国产精品国产三级国产专播精品人 | 玖玖爱这里只有精品| 男女激情视频一区| 日韩亚洲一区在线播放| 综合毛片免费视频| 亚洲精品一区二区久| 毛片基地在线观看| av午夜精品一区二区三区| 18黄暴禁片在线观看| 亚洲一区二区三区四区电影| 欧美另类在线观看| 精品人妻少妇嫩草av无码专区| 亚洲欧美日韩国产一区二区三区 | 国产第一页在线观看| 2021国产精品久久精品| 免费在线观看亚洲视频| 婷婷综合成人| 国产成人综合精品在线| 国产中文字幕在线播放| 在线亚洲人成电影网站色www| 在线免费观看麻豆| 日本不卡免费在线视频| 亚洲欧洲免费无码| 99久久久国产| 久久成人18免费网站| 性色av蜜臀av| 亚洲电影一级黄| 久久丫精品国产亚洲av不卡| 久久久久一区| 一区二区三区四区视频在线观看| 久久精品黄色| 久久99视频免费| 日本高清视频www| 欧美日韩综合视频| 久久国产柳州莫菁门| 久久国产婷婷国产香蕉| 超薄肉色丝袜足j调教99| eeuss鲁片一区二区三区| 97精品久久久| jizz在线观看视频| 欧美一级理论性理论a| 国产精品自拍视频一区| 久久久影院官网| 亚洲77777| 黑人一区二区| 日产中文字幕在线精品一区| av日韩一区| 欧美一性一乱一交一视频| 岛国大片在线观看| 日韩视频免费直播| 国产www在线| 中文字幕一区二区三区四区| 一级黄色免费视频| 日韩高清中文字幕一区| 大桥未久一区二区三区| 欧美电影免费网站| 成人福利网站在线观看11| 免费污视频在线观看| 亚洲午夜激情免费视频| 国产极品久久久| 日韩欧美精品免费在线| 国产精品久久久久久久精| 91在线观看免费视频| 亚洲理论中文字幕| 性娇小13――14欧美| 国内外成人激情免费视频| 中日韩免视频上线全都免费| 亚洲一区中文字幕| 欧美日韩尤物久久| 亚州成人av在线| 国产丝袜在线| 中文字幕日韩有码| 午夜av免费在线观看| 91精品国产欧美一区二区成人| 神马久久久久久久| 亚洲一级片在线观看| 国产无遮挡在线观看| 成人av资源网站| 欧洲在线免费视频| 久久一区国产| 国产午夜福利在线播放| 亚洲欧美综合久久久| 相泽南亚洲一区二区在线播放| 欧美精品中文| 国产区一区二区| 精品久久国产一区| 国产精品自拍偷拍视频| 欧美电影h版| 91sa在线看| bl在线肉h视频大尺度| 欧美成人精品激情在线观看| 日本暖暖在线视频| 亚洲天堂成人在线视频| 日韩中文字幕观看| 亚洲精品一区二区三区四区高清| 国产不卡精品视频| 欧美一级片在线| 99在线精品视频免费观看20| 欧美日韩国产综合一区二区三区| 一级一片免费看| 色综合天天综合在线视频| 天堂网一区二区三区| 亚洲国产一区二区在线播放| 精品97人妻无码中文永久在线| 亚洲欧洲日韩av| 在线观看亚洲网站| 一色屋精品亚洲香蕉网站| 精品伦精品一区二区三区视频密桃| 久久精品免视看| 日本成人午夜影院| 国产亚洲欧美在线| 波多野结衣一二三四区| 国产精品久久久久aaaa| 国产喷水在线观看| 综合av第一页| 欧美国产日韩综合| 亚洲午夜视频在线观看| 日韩男人的天堂| 红桃视频成人在线观看| 啦啦啦免费高清视频在线观看| 懂色aⅴ精品一区二区三区蜜月| 制服.丝袜.亚洲.中文.综合懂色| 精品国产户外野外| 波多野结衣电影在线播放| 欧美综合久久久| 国产一区二区波多野结衣| 欧美一区二区三区性视频| 国产高中女学生第一次| 亚洲第一区在线观看| 日中文字幕在线| 中文字幕亚洲欧美日韩在线不卡 | 五月天国产精品| 中文在线第一页| 欧美日韩日日夜夜| av中文字幕在线免费观看| 精品伦理精品一区| 你懂的在线观看视频网站| 中文字幕欧美日韩精品| 国产剧情在线| 国产69精品久久久久久| 蜜桃成人精品| 亚洲综合在线播放| 日韩高清影视在线观看| 午夜精品美女久久久久av福利| 亚洲精品网址| 男人靠女人免费视频网站| 日av在线不卡| 日韩成人av影院| 国产日韩精品一区| 九九视频在线观看| 一本色道a无线码一区v| 国产老女人乱淫免费| 亚洲精品一区二区久| 久操免费在线| 欧洲日本亚洲国产区| 精品国产一级| 日本欧洲国产一区二区| 欧美日韩伊人| 中国黄色片免费看| 99久精品国产| 99精品久久久久| 日本道在线观看一区二区| www.久久久久久久久久| 亚洲深夜福利网站| 波多野结衣中文在线| 国产精品亚发布| 日韩在线麻豆| 青青视频免费在线| 美女性感视频久久| 麻豆国产精品一区| 亚洲视频网在线直播| 狠狠狠狠狠狠狠| 亚洲高清一区二| 欧美hdxxx| 国产欧美日韩亚洲精品| 综合亚洲自拍| 人人干视频在线| 国产电影精品久久禁18| av在线网站观看| 亚洲精品欧美二区三区中文字幕| 亚洲精品视频在线观看免费视频| 69堂精品视频| 欧美一区二区三区| 国产精品极品美女在线观看免费| 精品国产乱子伦一区二区| 四虎免费在线观看视频| 免费观看日韩av| a级大片在线观看| 黑人狂躁日本妞一区二区三区 | 中文字幕免费高清在线观看| 亚洲国产精品va在看黑人| 中文字幕中文字幕在线中高清免费版| 国产欧美日韩视频| 成人免费看片39| 精品久久久噜噜噜噜久久图片| 99精品欧美一区二区三区小说| 欧美激情精品久久| 欧美一区二区视频免费观看| 免费观看在线黄色网| 国产精品久久久久7777婷婷| 国产成人精品999在线观看| 国产精品宾馆在线精品酒店| 99国产欧美另类久久久精品| 日韩三级免费看| 亚洲第一男人天堂| 麻豆理论在线观看| 精品麻豆av| 亚洲一区二区三区四区五区午夜| 波多野结衣视频播放| 偷窥少妇高潮呻吟av久久免费| 婷婷久久久久久| 8x拔播拔播x8国产精品| 欧美一级三级| wwwxxx黄色片| 亚洲国产精品成人综合| 中文字幕乱码人妻二区三区| 最近日韩中文字幕中文| 欧美日韩卡一| ijzzijzzij亚洲大全| 国产福利一区在线观看| 69精品久久久| 亚洲精品中文字幕女同| 精品成人av| 椎名由奈jux491在线播放| 国产一区二区三区香蕉| 久久精品波多野结衣| 亚洲精品国产欧美| 久久91导航| 在线一区日本视频| 国产成人一级电影| 中文字幕亚洲精品一区| 一本色道久久综合狠狠躁篇的优点 | 亚洲高清免费观看高清完整版在线观看| 精品国产亚洲av麻豆| 97精品视频在线播放| 精品久久美女| 精品人妻一区二区三| 婷婷丁香激情综合| 国产毛片在线| 147欧美人体大胆444| 亚洲综合丁香| www欧美com| 亚洲欧美成人网| 外国成人毛片| 777777av| 中文字幕在线一区二区三区| 丁香花免费高清完整在线播放| 国产91精品久久久久| 日韩一区电影| 91玉足脚交白嫩脚丫| 欧美色国产精品| 超碰中文在线| 亚洲成色www久久网站| 国产成人久久精品77777最新版本| 综合网在线观看| 欧美大片免费看| 精品久久久久久久| 黑森林av导航| 欧美日本国产视频| 性欧美xxx69hd高清| 国产乱子伦精品视频| 欧美韩国一区二区| 亚洲av成人精品毛片|