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

主頁 > 知識庫 > Ruby的語法和語言特性總結(jié)

Ruby的語法和語言特性總結(jié)

熱門標簽:真人語音電銷機器人系統(tǒng) 浦東上海400開頭的電話申請 買了外呼系統(tǒng)不想用了怎么辦 開封百應(yīng)電銷機器人聯(lián)系方式 武漢呼叫中心外呼系統(tǒng)線路商 邯鄲外呼調(diào)研線路 樂昌電話機器人 北京語音電銷機器人價格 電話機器人電話卡封號怎么辦

Ruby是一種解釋型、面向?qū)ο蟆討B(tài)類型的語言。Ruby采取的策略是在靈活性和運行時安全之間尋找平衡點。隨著Rails框架的出現(xiàn),Ruby也在2006年前后一鳴驚人,同時也指引人們重新找回編程樂趣。盡管從執(zhí)行速度上說,Ruby談不上有多高效,但它卻能讓程序員的編程效率大幅提高。本文將講述Ruby語言的基礎(chǔ)語言特性,包括基本的語法及代碼塊和類的定義。

1. 基礎(chǔ)
在Ruby交互命令行中輸入以下命令(>>為命令行提示符,=>為返回值;下文將把=>符號和語句寫在一行內(nèi)表明其返回值):

>> puts 'hello, world'
hello, world
=> nil

>> language = 'Ruby'
=> "Ruby"

>> puts "hello, #{language}"
hello, Ruby
=> nil

以上代碼使用puts輸出,給變量賦值,并用#{}的語法實現(xiàn)字符串替換。這表明Ruby是解釋執(zhí)行的;變量無需聲明即可直接初始化和賦值;每條Ruby代碼都會返回某個值;單引號包含的字符串表示它將直接被解釋,雙引號包含的字符串會引發(fā)字符串替換。

1.1 編程模型

Ruby是一門純面向?qū)ο笳Z言,在Ruby中一切皆為對象,可以用“.”調(diào)用對象具有的方法,可以通過class和methods方法查看對象的類型及支持的方法,如4.class => Fixnum,7.methods => ["inspect", "%", "", "numerator", ...],false.class => FalseClass(方括號表示數(shù)組)。

1.2 流程控制

條件判斷有正常的塊形式,也有簡單明了的單行形式;除了常見的if語句外,還有unless語句(等價于if not,但可讀性更強)。同理,循環(huán)也有正常的塊形式和單行形式。注意:除了nil和false之外,其他值都代表true,包括0!

# 塊形式
if x == 4
 puts 'This is 4.'
end
# 單行形式
puts 'This is false.' unless true
x = x + 1 while x  10 # x的結(jié)果為10
x = x - 1 until x == 1 # x的結(jié)果為1

和其他C家族的語言差不多,Ruby的邏輯運算符and()、or(||)都自帶短路功能,若想執(zhí)行整個表達式,可以用或|

1.3 鴨子類型

執(zhí)行4 + 'four'會出現(xiàn)TypeError的錯誤,說明Ruby是強類型語言,在發(fā)生類型沖突時,將得到一個錯誤。如果把個語句放在def...end函數(shù)定義中,則只有在調(diào)用函數(shù)時才會報錯,說明Ruby在運行時而非編譯時進行類型檢查,這稱為動態(tài)類型。Ruby的類型系統(tǒng)有自己的潛在優(yōu)勢,即多個類不必繼承自相同的父類就能以“多態(tài)”的方式使用:

a = ['100', 100.0]
puts a[0].to_i # => 100
puts a[1].to_i # => 100

這就是所謂的“鴨子類型”(duck typing)。數(shù)組的第一個元素是String類型,第二個元素是Float類型,但轉(zhuǎn)換成整數(shù)用的都是to_i。鴨子類型并不在乎其內(nèi)在類型是什么,只要一個對象像鴨子一樣走路,像鴨子一樣嘎嘎叫,那它就是只鴨子。在面向?qū)ο笤O(shè)計思想中,有一個重要原則:對接口編碼,不對實現(xiàn)編碼。如果利用鴨子類型,實現(xiàn)這一原則只需極少的額外工作,就能輕松完成。

1.4 函數(shù)

def tell_the_truth
 true
end

每個函數(shù)都會返回結(jié)果,如果沒有顯式指定返回值,函數(shù)就將退出函數(shù)前最后處理的表達式的值返回。函數(shù)也是個對象,可以作為參數(shù)傳給其他函數(shù)。

1.5 數(shù)組

和Python一樣,Ruby的數(shù)組也是用中括號來定義,如animals = ['lion', 'tiger', 'bear'];負數(shù)下標可以返回倒數(shù)的元素,如animals[-1] => "bear";通過指定一個Range對象來獲取一個區(qū)段的元素,如animals[1..2] => ['tiger', 'bear']。此外,數(shù)組元素可以互不相同,多為數(shù)組也不過是數(shù)組的數(shù)組。數(shù)組擁有極其豐富的API,可用其實現(xiàn)隊列、鏈表、棧、集合等等。

1.6 散列表

numbers = {2 => 'two', 5 => 'five'}
stuff = {:array => [1, 2, 3], :string => 'Hi, mom!'}
# stuff[:string] => "Hi, mom!"

散列表可以帶任何類型的鍵,上述代碼的stuff的鍵較為特殊——它是一個符號(symbol),前面帶有冒號標識符。符號在給事物和概念命名時很好用,例如兩個同值字符串在物理上不同,但相同的符號卻是同一物理對象,可以通過反復(fù)調(diào)用'i am string'.object_id和:symbol.object_id來觀察。另外,當散列表用作函數(shù)最后一個參數(shù)時,大括號可有可無,如tell_the_truth :profession => :lawyer。

2. 面向?qū)ο?br /> 2.1 代碼塊

代碼塊是沒有名字的函數(shù)(匿名函數(shù)),可以用作參數(shù)傳遞給函數(shù)。代碼塊只占一行時用大括號包起來,占多行是用do/end包起來,可以帶若干個參數(shù)。

3.times {puts 'hehe'} # 輸出3行hehe
['lion', 'tiger', 'bear'].each {|animal| puts animal} # 輸出列表的內(nèi)容

上面的times實際上是Fixnum類型的方法,要自己實現(xiàn)這樣一個方法非常容易:

class Fixnum
 def my_times
  i = self
   while i > 0
    i = i - 1
    yield
  end
 end
end
3.my_times {puts 'hehe'} # 輸出3行hehe

這段代碼打開一個現(xiàn)有的類,向其中添加一個自定義的my_times方法,并用yield調(diào)用代碼塊。在Ruby中,代碼塊不僅可用于循環(huán),還可用于延遲執(zhí)行,即代碼塊中的行為只有等到調(diào)用相關(guān)的yield時才會執(zhí)行。代碼塊充斥于Ruby的各種庫,小到文件的每一行,大到在集合上進行各種復(fù)雜操作,都是由代碼塊來完成的。

2.2 類

調(diào)用一個對象的class方法可以查看其類型,調(diào)用superclass可以查看這個類型的父類。下圖展示了數(shù)字的繼承鏈,其中橫向箭頭表示右邊是左邊實例化的對象,縱向箭頭表示下邊繼承于上邊。Ruby的一切事物都有一個共同的祖先Object。

最后通過一個完整的實例——定義一棵樹,來看下Ruby的類如何定義和使用,該注意的點都寫在注釋里面了。

class Tree
 # 定義實例變量,使用attr或attr_accessor關(guān)鍵字,前者定義變量和訪問變量的同名getter方法(即只讀),后者定義的變量多了同名setter方法(注意這里使用了符號)
 attr_accessor :children, :node_name

 # 構(gòu)造方法(構(gòu)造方法必須命名為initialize)
 def initialize(name, children=[])
  @node_name = name
  @children = children
 end

 # 遍歷所有節(jié)點并執(zhí)行代碼塊block,注意參數(shù)前加一個表示將代碼塊作為閉包傳遞給函數(shù)
 def visit_all(block)
  visit block
  children.each {|c| c.visit_all block}
 end

 # 訪問一個節(jié)點并執(zhí)行代碼塊block
 def visit(block)
  block.call self
 end
end

ruby_tree = Tree.new("Ruby", 
 [Tree.new("Reia"),
  Tree.new("MacRuby")])
# 訪問一個節(jié)點
ruby_tree.visit {|node| puts node.node_name}
# 訪問整棵樹
ruby_tree.visit_all {|node| puts "Node: #{node.node_name}"}

再提一下Ruby的命名規(guī)范:

(1)類采用CamelCase命名法
(2)實例變量(一個對象有一個值)前必須加上@,類變量(一個類有一個值)前必須加上@@
(3)變量和方法名全小寫用下劃線命名法,如underscore_style
(4)常量采用全大寫下劃線命名法,如ALL_CAPS_STYLE
(5)用于邏輯測試的函數(shù)和方法一般要加上問號,如if test?

3. 模塊與混入(Mixin)
面向?qū)ο笳Z言利用繼承,將行為傳播到相似的對象上。若一個對象像繼承多種行為,一種做法是用多繼承,如C++;Java采用接口解決這一問題,Ruby采用模塊Mixin。模塊是函數(shù)和常量的集合,若在類中包含一個模塊,那么該模塊的行為和常量也會成為類的一部分。

# 定義模塊ToFile
module ToFile
 # 獲取文件名
 def filename
  "object_name.txt"
 end

 # 創(chuàng)建文件
 def to_f
  File.open(filename, 'w') {|f| f.write(to_s)} # 注意這里to_s在其他地方定義!
 end
end

# 定義用戶類
class Person
 include ToFile
 attr_accessor :name

 def initialize(name)
  @name = name
 end

 def to_s
  name
 end
end

Person.new('matz').to_f # 創(chuàng)建了一個文件object_name.txt,里面包含內(nèi)容matz

上面的代碼很好理解,只是有一點要注意:to_s在模塊中使用,在類中實現(xiàn),但定義模塊的時候,實現(xiàn)它的類甚至還沒有定義。這正是鴨子類型的精髓所在。寫入文件的能力,和Person這個類沒有一點關(guān)系(一個類就應(yīng)該做屬于它自己的事情),但實際開發(fā)又需要把Person類寫入文件這種額外功能,這時候mixin就可以輕松勝任這種要求。

Ruby有兩個重要的mixin:枚舉(enumerable)和比較(comparable)。若想讓類可枚舉,必須實現(xiàn)each方法;若想讓類可比較,必須實現(xiàn)=>(太空船)操作符(比較a,b兩操作數(shù),返回1、0或-1)。Ruby的字符串可以這樣比較:'begin' => 'end => -1。數(shù)組有很多好用的方法:

a = [5, 3, 4, 1]
a.sort => [1, 3, 4, 5] # 整數(shù)已通過Fixnum類實現(xiàn)太空船操作符,因此可比較可排序
a.any? {|i| i > 4} => true
a.all? {|i| i > 0} => true
a.collect {|i| i * 2} => [10, 6, 8, 2]
a.select {|i| i % 2 == 0} => [4]
a.member?(2) => false
a.inject {|product, i| product * i} => 60 # 第一個參數(shù)是代碼塊上一次執(zhí)行的結(jié)果,若不設(shè)初始值,則使用列表第一個值作為初始值

4. 元編程(metaprogramming)
所謂元編程,說白了就是“寫能寫程序的程序”,這說起來有點拗口,下面會通過實例來講解。

4.1 開放類

可以重定義Ruby中的任何類,并給它們擴充任何你想要的方法,甚至能讓Ruby完全癱瘓,比如重定義Class.new方法。對于開發(fā)類來說,這種權(quán)衡主要考慮了自由,有這種重定義任何類或?qū)ο蟮淖杂桑湍軐懗黾礊橥ㄋ滓锥拇a,但也要明白,自由越大、能力越強,擔負的責任也越重。

class Numeric
 def inches
  self
 end
 def feet
  self * 12.inches
 end
 def miles
  self * 5280.feet
 end
 def back
  self * -1
 end
 def forward
  self
 end
end

上面的代碼通過開放Numeric類,就可以像這樣采用最簡單的語法實現(xiàn)用英寸表示距離:puts 10.miles.back,puts 2.feet.forward。

4.2 使用method_missing

Ruby找不到某個方法時,會調(diào)用一個特殊的回調(diào)方法method_missing顯示診斷信息。通過覆蓋這個特殊方法,可以實現(xiàn)一些非常有趣且強大的功能。下面這個示例展示了如何用簡潔的語法來實現(xiàn)羅馬數(shù)字。

class Roman
 # 覆蓋self.method_missing方法
 def self.method_missing name, *args
  roman = name.to_s
  roman.gsub!("IV", "IIII")
  roman.gsub!("IX", "VIIII")
  roman.gsub!("XL", "XXXX")
  roman.gsub!("XC", "LXXXX")

  (roman.count("I") +
   roman.count("V") * 5 +
   roman.count("X") * 10 +
   roman.count("L") * 50 +
   roman.count("C") * 100)
 end
end

puts Roman.III # => 3
puts Roman.XII # => 12

我們沒有給Roman類定義什么實際的方法,但已經(jīng)可以Roman類來表示任何羅馬數(shù)字!其原理就是在沒有找到定義方法時,把方法名稱和參數(shù)傳給method_missing執(zhí)行。首先調(diào)用to_s把方法名轉(zhuǎn)為字符串,然后將羅馬數(shù)字“左減”特殊形式轉(zhuǎn)換為“右加”形式(更容易計數(shù)),最后統(tǒng)計各個符號的個數(shù)和加權(quán)。

當然,如此強有力的工具也有其代價:類調(diào)試起來會更加困難,因為Ruby再也不會告訴你找不到某個方法。因此method_missing是一把雙刃劍,它確實可以讓語法大大簡化,但是要以人為地加強程序的健壯性為前提。

4.3 使用模塊

Ruby最流行的元編程方式,非模塊莫屬。下面的代碼講述如何用模塊的方式擴展一個可以讀取csv文件的類。

module ActsAsCsv

 # 只要某個模塊被另一模塊include,就會調(diào)用被include模塊的included方法
 def self.included(base)
  base.extend ClassMethods
 end

 module ClassMethods
  def acts_as_csv
   include InstanceMethods
  end
 end

 module InstanceMethods
  attr_accessor :headers, :csv_contents

  def initialize
   read
  end

  def read
   @csv_contents = []
   filename = self.class.to_s.downcase + '.txt'
   file = File.new(filename)
   @headers = file.gets.chomp.split(', ') # String的chomp方法去除字符串末尾的回車換行符
   file.each do |row|
    @csv_contents  row.chomp.split(', ')
   end
  end
 end

end # end of module ActsAsCsv

class RubyCsv  # 沒有繼承,可以自由添加
 include ActsAsCsv
 acts_as_csv
end

m = RubyCsv.new
puts m.headers.inspect
puts m.csv_contents.inspect

上述代碼中RubyCsv包含了ActsAsCsv,所以ActsAsCsv的included方法中,base就指RubyCsv,ActsAsCsv模塊給RubyCsv類添加了唯一一個類方法acts_as_csv,這個方法又打開RubyCsv類,并在類中包含了所有實例方法。如此這般,就寫了一個會寫程序的程序(通過模塊來動態(tài)添加類方法)。

一些出色的Ruby框架,如Builder和ActiveRecord,都會為了改善可讀性而特別依賴元編程。借助元編程的威力,可以做到盡量縮短正確的Ruby語法與日常用于之間的距離。注意一切都是為了提升代碼可讀性而服務(wù)。

5. 總結(jié)
Ruby的純面向?qū)ο罂梢宰屇阌靡恢碌姆绞絹硖幚韺ο蟆x喿宇愋透鶕?jù)對象可提供的方法,而不是對象的繼承層次,實現(xiàn)了更切合實際的多態(tài)設(shè)計。Ruby的模塊和開放類,使程序員能把行為緊密結(jié)合到語法上,大大超越了類中定義的傳統(tǒng)方法和實例變量。
核心優(yōu)勢:
(1)優(yōu)雅的語法和強大的靈活性
(2)腳本:Ruby是一門夢幻般的腳本語言,可以出色地完成許多任務(wù)。Ruby許多語法糖可以大幅提高生產(chǎn)效率,各種各樣的庫和gem(Ruby包)可以滿足絕大多數(shù)日常需要。
(3)Web開發(fā):很多人學Ruby最終就是為了用Ruby on Rails框架來進行Web開發(fā)。作為一個極其成功的MVC框架,其有著廣泛的社區(qū)支持及優(yōu)雅的語法。Twitter最初就是用Ruby實現(xiàn)的,借助Ruby無比強大的生產(chǎn)力,可以快速地開發(fā)出一個可推向市場的合格產(chǎn)品。
不足之處:
(1)性能:這是Ruby的最大弱點。隨著時代的發(fā)展,Ruby的速度確實是越來越快。當然,Ruby是創(chuàng)建目的為了改善程序員的體驗,在對性能要求不高的應(yīng)用場景下,性能換來生產(chǎn)效率的大幅提升無疑是值得的。
(2)并發(fā)和面向?qū)ο缶幊蹋好嫦驅(qū)ο笫墙⒃跔顟B(tài)包裝一系列行為的基礎(chǔ)上,但通常狀態(tài)是會改變的。程序中存在并發(fā)時,這種編程策略就會引發(fā)嚴重問題。
(3)類型安全:靜態(tài)類型可提供一整套工具,可以更輕松地構(gòu)造語法樹,也因此能實現(xiàn)各種IDE。對Ruby這種動態(tài)類型語言來說,實現(xiàn)IDE就困難得多。

您可能感興趣的文章:
  • Ruby語法筆記
  • Ruby的基礎(chǔ)語法入門學習教程
  • Ruby編程中的語法使用風格推薦
  • Ruby基礎(chǔ)語法初探
  • Ruby中一些基本語法知識點的羅列匯總
  • ruby聲明式語法的實現(xiàn)例子
  • Ruby的基本語法學習總結(jié)
  • ruby 學習筆記(1) 初識語法

標簽:鄂州 宜春 河北 松原 六安 淄博 石嘴山 自貢

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Ruby的語法和語言特性總結(jié)》,本文關(guān)鍵詞  Ruby,的,語法,和,語言,特性,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Ruby的語法和語言特性總結(jié)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Ruby的語法和語言特性總結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    中文字幕精品三区| 久久一二三国产| 欧美一区中文字幕| 国产婷婷色一区二区三区| 亚洲制服丝袜在线| 国产最新精品免费| 在线精品视频免费播放| 精品国产亚洲在线| 亚洲小少妇裸体bbw| 粉嫩在线一区二区三区视频| 91精品国产黑色紧身裤美女| 成人免费在线观看入口| 久久狠狠亚洲综合| 欧洲色大大久久| 国产精品乱人伦| 精品制服美女丁香| 欧美日韩国产综合一区二区三区| 久久久久久99久久久精品网站| 调教+趴+乳夹+国产+精品| 成人国产电影网| 久久精品一区二区三区av| 日韩黄色在线观看| 欧美午夜一区二区| 国产精品久久99| 成人开心网精品视频| 337p粉嫩大胆色噜噜噜噜亚洲| 日韩影院在线观看| 欧美影院午夜播放| 亚洲精品国久久99热| 91在线视频免费91| 亚洲免费观看高清完整版在线观看 | 久久久另类综合| 另类小说图片综合网| 欧美一二区视频| 日本在线观看不卡视频| 宅男在线国产精品| 欧美aaaaaa午夜精品| 91精品国产91热久久久做人人| 亚洲成人免费视频| 欧美久久久影院| 亚洲超碰精品一区二区| 777午夜精品视频在线播放| 亚洲一区二区综合| 精品1区2区3区| 午夜成人免费视频| 欧美一区二区三区在线看| 日本视频中文字幕一区二区三区| 欧美亚洲一区二区在线观看| 亚洲成人动漫av| 91精品国产欧美一区二区18| 麻豆成人在线观看| 久久精品人人做人人爽人人| 福利一区福利二区| 亚洲精品午夜久久久| 欧美日韩免费观看一区三区| 日本视频在线一区| 久久久亚洲欧洲日产国码αv| 国产成人av一区| 亚洲色图清纯唯美| 欧美精品久久一区| 极品尤物av久久免费看| 中文子幕无线码一区tr| 欧美日韩一区二区在线观看| 免费成人美女在线观看.| 精品免费日韩av| 成人美女视频在线看| 亚洲高清中文字幕| 久久久久久久久免费| 欧洲另类一二三四区| 全部av―极品视觉盛宴亚洲| 欧美激情中文字幕一区二区| 欧美午夜宅男影院| 国产一区二区三区四| 亚洲欧美经典视频| 日韩三级免费观看| 成人在线一区二区三区| 亚洲444eee在线观看| 国产日韩av一区二区| 欧美日本视频在线| 成人午夜av在线| 日韩激情中文字幕| 综合在线观看色| 日韩精品中文字幕在线不卡尤物| yourporn久久国产精品| 蜜臀精品一区二区三区在线观看| 136国产福利精品导航| 欧美一级黄色大片| 91麻豆国产香蕉久久精品| 精品一二线国产| 亚洲一区二区高清| 中文幕一区二区三区久久蜜桃| 欧美日韩中文一区| 99国产欧美另类久久久精品| 激情另类小说区图片区视频区| 午夜一区二区三区视频| 国产精品网友自拍| 久久综合九色欧美综合狠狠| 欧美高清视频不卡网| 91美女片黄在线观看91美女| 成人自拍视频在线| 国产精品一区二区三区乱码| 日本va欧美va瓶| 天堂影院一区二区| 一区二区三区在线视频观看| 国产欧美日韩久久| 久久夜色精品一区| 欧美一区二区三区精品| 欧美色手机在线观看| 91黄色激情网站| 91福利在线看| 91久久精品网| 91久久久免费一区二区| 一本色道久久综合亚洲91| 波多野结衣在线一区| 成人av在线播放网站| 国产成人午夜精品影院观看视频| 久久精品国产成人一区二区三区| 亚洲成人三级小说| 日韩精品一二区| 日韩中文字幕av电影| 日韩和欧美一区二区| 美女视频黄 久久| 美女视频黄频大全不卡视频在线播放| 亚洲成人www| 老司机精品视频导航| 久久99深爱久久99精品| 国产毛片精品一区| 国产精品1024久久| 成人黄色一级视频| 99国产精品久| 欧美亚洲动漫精品| 欧美日本一道本| 日韩精品在线网站| 久久精品视频免费观看| 亚洲欧洲日产国码二区| 亚洲国产综合91精品麻豆 | 欧美国产日产图区| 国产精品久久综合| 亚洲成av人片在线观看| 男女男精品网站| 国产福利精品一区| 91捆绑美女网站| 91精品国产综合久久精品麻豆 | 欧美三级电影网| 欧美一级高清片| 欧美国产丝袜视频| 亚洲一区二区视频| 久久99国产精品麻豆| 成人免费不卡视频| 欧美日韩在线一区二区| 久久精品人人做人人爽97| 亚洲日本免费电影| 蜜桃视频在线观看一区| 成人性生交大片免费看中文| 欧美日韩久久不卡| 久久精品人人爽人人爽| 亚洲午夜免费福利视频| 国产精品乡下勾搭老头1| 色拍拍在线精品视频8848| 欧美大片国产精品| 亚洲视频在线一区二区| 日本欧美在线看| 色综合咪咪久久| 精品国产a毛片| 一区二区三区在线播放| 成人在线视频一区二区| 日韩一级大片在线| 一区二区三区日韩精品视频| 国产成人自拍在线| 欧美电影一区二区| 亚洲日本丝袜连裤袜办公室| 国产一区二区三区高清播放| 欧美日韩日本视频| 一区二区中文视频| 久草精品在线观看| 欧美日韩激情在线| 亚洲人成伊人成综合网小说| 国产一区二区成人久久免费影院| 欧美日韩中文精品| 一区二区三区欧美| 成人精品国产免费网站| 亚洲精品一线二线三线| 日韩影院精彩在线| 91精品国产色综合久久ai换脸| 一区二区视频在线| 成人动漫一区二区在线| 国产视频一区在线观看| 紧缚奴在线一区二区三区| 91精品国产综合久久久久久久久久 | 精品视频一区 二区 三区| 亚洲欧美综合另类在线卡通| 国产在线一区二区综合免费视频| 91精品国产91久久久久久最新毛片| 亚洲大片在线观看| 欧美日韩国产一级二级| 一区二区视频在线看| 91电影在线观看| 亚洲一区二区视频| 欧美日本视频在线| 青娱乐精品在线视频|