国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > Ruby > 正文

總結Ruby中的block、proc、lambda區別

2020-02-24 15:39:50
字體:
來源:轉載
供稿:網友

Ruby的閉包使用是非常頻繁的,為了徹底理解代碼,小編再次仔細研究了Ruby的閉包,特別是block、proc和lambda幾種用法的異同,今天這篇文章是武林技術頻道小編和你分享的經驗之談。

閉包是 Ruby 相對其它語言特別優勢之一,很多語言有閉包,但是唯有 Ruby 把閉包的優勢發揮得淋漓盡致。Ruby 的哲學之一:同一個問題現實中有多種解決方法,所以 Ruby 中也有多種解法,所以閉包的使用也有多種方法。

先看一個代碼的例子:

Example 1:

復制代碼 代碼如下:

def foo1
? yield
end

?

def foo2(&b)
? b.call if b
end

foo1 { puts "foo1 in block" }
foo2 { puts "foo2 in block" }
proc = Proc.new { puts "foo in proc" }
foo1(&proc)
foo2(&proc)
lambda_proc = lambda { puts "foo in lambda" }
foo1(&lambda_proc)
foo2(&lambda_proc)

?

輸出:

復制代碼 代碼如下:

》foo1 in block
》foo2 in block
》foo in proc
》foo in proc
》foo in lambda
》foo in lambda

?

大家是不是有些困惑,首先是方法 foo1 和 foo2 都能接收閉包,它們這兩種寫法有什么區別,然后是作為參數的三種閉包 block,proc和 lambda有什么區別。

1. yield 和 block call 的區別

yield 和 block call 兩種都能實現運行閉包,從實際運行效果來說,區別不大。其區別主要在于:

1.1 閉包的傳遞和保存

因為閉包已經傳遞到參數里,所以可以繼續傳遞或保存起來,例如:

Exampl 2:

復制代碼 代碼如下:

?class A
????? def foo1(&b)
???????? @proc = b
????? end
????? def foo2
????????? @proc.call if @proc
????? end
?? end

?

??? a = A.new
??? a.foo1 { puts "proc from foo1" }
??? a.foo2

?

1.2 性能

yield不是方法調用,而是 Ruby 的關鍵字,yield 要比 block call 比快 1 倍左右。

2. block 和 proc, lambda 的區別

很簡單直接,引入 proc 和 lambda 就是為了復用,避免重復定義,例如在 example 1 中,使用 proc 變量存儲閉包,避免重復定義兩個 block 。

3. proc 和 lambda 的區別

這大概是最讓人困惑的地方,從 Example 1 的行為上看,他們的效果是一致的,為什么要用兩種不同的表達方式。

復制代碼 代碼如下:

?proc = Proc.new { puts "foo in proc" }
?? lambda_proc = lambda { puts "foo in lambda" }

?

確實,對于簡單的情況,比如 Example 1的情況,他們的行為是一致的,但是主要在兩個地方有明顯差異:

1.1 參數檢查

還是例子說話 Example 3:

復制代碼 代碼如下:

def foo
????? x = 100
????? yield x
?? end

?

?? proc = Proc.new { |a, b| puts "a is #{a.inspect} b is #{b.inspect}" }
?? foo(&proc)


?? lambda_proc1 = lambda { |a| puts "a is #{a.inspect}" }
?? foo(&lambda_proc1)
?? lambda_proc2 = lambda { |a, b| puts "a is #{a.inspect} b is #{b.inspect}" }
?? foo(&lambda_proc2)

?

輸出

?

復制代碼 代碼如下:

?? 》a is 100 b is nil
?? 》a is 100
?? 》ArgumentError: wrong number of arguments (1 for 2)
????? …

?

可見,proc 不會對參數進行個數匹配檢查,而 lambda 會,如果不匹配還會報異常,所以安全起見,建議優先用 lambda。

1.2 返回上層

還是例子說話 Example 4:

?

復制代碼 代碼如下:

?def foo
???? f = Proc.new { return "return from foo from inside proc" }
???? f.call # control leaves foo here
???? return "return from foo"
?? end

?


?? def bar
???? f = lambda { return "return from lambda" }
???? puts f.call # control does not leave bar here
???? return "return from bar"
?? end


?? puts foo
?? puts bar

?

輸出

?

復制代碼 代碼如下:

?? 》return from foo from inside proc
?? 》return from lambda
?? 》return from bar

?

可見,proc 中,return 相當于執行了閉包環境里的 return,而 lambda 只是返回call 閉包所在環境。

閉包是 Ruby 的強大特性,它的幾種表達方式block,proc 和 lambda有細微差別,要用好它需要對其深入理解。

閉包是Ruby的一個強大特性,而block、proc和lambda的幾個表達式有細微的差別。為了更好地使用它,武林技術頻道小編帶大家來學習吧!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产精品伦一区二区三区级视频频| 日本欧美在线视频免费观看| 免费在线看v| 蜜桃视频中文字幕| 欧美成人精品福利网站| 精品孕妇一区二区三区| 欧美精品se| 国产精品美女视频免费观看软件 | 国产青草视频在线观看视频| 国产精品伦理一区二区三区| 四虎国产精品永久地址998| 好男人社区在线视频| 国产激情在线| www在线视频| 国产成人亚洲欧美电影| 青青草在线播放| 精品欧美日韩一区二区| 九九99精品| 国产高清免费av在线| 人日人天天爽| 9999在线视频| 国产毛片在线| wwww在线观看| 伊人影院在线观看| 国产一级粉嫩xxxx| 国产69精品久久久久孕妇国产69久久| 69免费视频| 国产三级视频在线看| 黄色一级视频网站| 久久精品最新免费国产成人| 尤物在线精品视频| 91极品在线| 99中文字幕一区| 国产乱精品一区二区三区| 天天草天天操| a视频在线观看免费| 亚洲一区二区三区在线观看网站| 天堂资源最新在线| 尤物视频网站在线观看| 尤物视频在线看| 国产一级在线| 国产网站免费看| 中文字幕在线免费看| 午夜视频99| 国产特级嫩嫩嫩bbb| 91caoporn在线| 国产色在线 com| 国产激情视频在线| 国产网红在线观看| 97在线免费| 性网站在线播放| 日本福利在线观看| 天天爱天天做色综合| 国产三级在线看| 99热99re6国产在线播放| 亚洲男人的天堂成人| 免费男女羞羞的视频网站中文字幕| 三级小说一区| 99视频免费| 在线a人片免费观看视频| 青青草免费在线观看| 久草视频国产| 91久久精品国产性色| 伊人网在线视频| 九九热视频免费观看| 91精选福利| 国内自拍视频在线看免费观看| 国产一区二区影视| 18av在线播放| 国产在线观看色| 精精国产xxxx视频在线动漫 | 国产福利在线免费观看| 99热免费在线| √天堂资源地址在线官网| 99reav| 国产美女视频一区二区三区| 国产一级免费黄色片| 精品国产高清a毛片无毒不卡| 青青艹在线视频| 国产小视频免费在线观看| 亚洲欧美自拍另类| 国产视频三区| 懂色av中文在线| 欧美日韩一区二区三区在线播放| 97国产视频| 国产成人亚洲精品播放器下载| 免费99热在线观看| 一级二级在线观看| 中文字幕4区| 精灵使的剑舞无删减版在线观看| 中文字幕第一页av| 国产农村av| a视频在线观看| av在线不卡播放| 日本a级黄色| 麻豆国产在线视频| 欧美色第一页| www.狠狠色.com| 四虎国产精品永久| 性网站在线观看| 影音先锋日韩| 亚洲an天堂an在线观看| 91涩漫在线观看c| 依依成人在线| 免费看的av| 国产精选在线观看| 国产爆初菊在线观看免费视频网站| 中文字幕在线观看av| 国产一二三四| 国产高清在线观看| 在线视频三级| 免费电影网站在线视频观看福利| 欧美日韩在线精品成人综合网| 欧美日韩在线资源| 中文字幕免费中文| 精品一区二区三区高清免费不卡| 在线视频福利| 国产专区在线| 精品麻豆视频| 国产免费网址| 99在线视频观看| 青青久草在线| 国产九色视频| 性网站在线观看| 99热在线免费观看| 在线观看av中文| 国产美女在线免费观看| 2020国产在线视频| 欧美日韩**字幕一区| 国产日韩欧美第一页| 日本高清中文字幕| 91资源在线观看| 国产免费永久在线观看| 一级二级在线观看| 中文字幕不卡免费视频| 四虎一区二区三区| 国产精品18久久久久网站| av在线免费播放网站| 国产人成高清视频观看| 国产在线观看网站| 精品美女调教视频| 国产女王在线**视频| 高清av中文在线字幕观看1| 国产三区视频在线观看| 欧美成人亚洲高清在线观看| 中文资源在线网| 91在线视频免费看| 国产成人精品实拍在线| 天天操天天是| 午夜视频免费在线观看| 免费女人毛片视频| 青草在线视频在线观看| av大片在线播放| 在线视频婷婷| 91青青在线视频| 国产高清视频免费最新在线| 国产一区二区三区福利| 天天操天天是| 最好看更新中文字幕| 天堂亚洲精品| 国产激情在线视频| 精品亚洲成a人片在线观看| 国产福利在线免费观看| 18被视频免费观看视频| av丝袜在线| 欧美xxxxx性| 国产女人在线视频| 高潮毛片在线观看| 天天操天天是| 国产高清视频在线播放| 中文字幕av高清| 欧美大交乱xxxx| 国产美女在线播放| 国产天堂在线| 在线观看视频污| 久热久精久品这里在线观看| 丁香花在线电影| 国产福利在线免费观看| 午夜影院在线| 国产精品一区二区三区视频网站 | 国产精品免费麻豆入口| 国产福利三区| 免费a级毛片在线播放| 在线91av| 先锋影音av中文字幕| 九九在线免费视频| 国产精品久久久久久精| 亚洲国产成人综合| 国产九色在线| av在线第一页| 国产黄色片在线播放| 国内自拍视频在线观看| 91免费日韩| 免费观看一二区视频网站| 国产精品合集一区二区| 免费av在线| 夜夜操天天干| 国产精品18久久久久网站| 久久国产精品久久久久久小说| 国产一二三区在线|