亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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的幾個表達式有細微的差別。為了更好地使用它,武林技術頻道小編帶大家來學習吧!

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精久久久久久| 国产小视频国产精品| xxx成人少妇69| 欧美成aaa人片免费看| 日韩性生活视频| 久久久久久久久中文字幕| 久久在线精品视频| 俺去亚洲欧洲欧美日韩| 麻豆精品精华液| 国产午夜精品一区二区三区| 在线视频一区二区| 国产香蕉精品视频一区二区三区| 久久久精品国产网站| 国产精品综合久久久| 亚洲一区二区三区成人在线视频精品| 欧美国产一区二区三区| 久久精品国产成人| 成人精品福利视频| 欧美与黑人午夜性猛交久久久| 日韩一区二区精品视频| 亚洲一区美女视频在线观看免费| 亚洲第一福利视频| 国产精品一区二区女厕厕| 国语自产精品视频在线看| 国产一区二区三区高清在线观看| 一区二区成人av| 亚洲国产福利在线| 国产精品国产福利国产秒拍| 国产黑人绿帽在线第一区| 久久精品人人爽| 国产精品电影久久久久电影网| 91精品国产亚洲| 欧美日韩国产成人在线观看| 久久777国产线看观看精品| 国产做受69高潮| 欧美亚洲国产另类| 精品国产一区二区三区久久狼5月| 国产亚洲一级高清| 福利视频一区二区| 最新国产精品拍自在线播放| 欧美视频裸体精品| 久久久视频免费观看| 欧美激情性做爰免费视频| 亚洲最大福利视频网| 91精品国产沙发| 亚洲欧洲av一区二区| 欧美一级高清免费| 亚洲国产成人久久综合| 欧美一区二区三区艳史| 国产精品亚洲综合天堂夜夜| 日日噜噜噜夜夜爽亚洲精品| 7777精品久久久久久| 国产日韩中文字幕| 久久影院中文字幕| 中文在线不卡视频| 国产精品jvid在线观看蜜臀| 亚洲第一福利视频| 国产亚洲精品久久久优势| 亚洲尤物视频网| 久久成人亚洲精品| 色中色综合影院手机版在线观看| 亚洲美女精品成人在线视频| 欧美一区三区三区高中清蜜桃| 日韩专区中文字幕| 日韩在线观看免费高清完整版| 欧美精品一区二区免费| 亚洲护士老师的毛茸茸最新章节| 91精品视频在线免费观看| 亚洲一区av在线播放| 亚洲国产精品成人va在线观看| 国产精品免费视频xxxx| 亚洲尤物视频网| 欧美日韩另类字幕中文| 国产精品7m视频| 欧美裸体xxxx极品少妇软件| 日韩在线观看免费| 国产不卡av在线| 亚洲第一免费网站| 性欧美长视频免费观看不卡| 欧美高清在线播放| 91成人在线播放| 九九九热精品免费视频观看网站| 亚洲一区二区三区毛片| 91系列在线播放| 国内精品久久久久影院 日本资源| 狠狠躁夜夜躁人人爽超碰91| 国产精品h在线观看| 日韩欧美亚洲一二三区| 欧美一级片久久久久久久| 久久久久久久一| 丁香五六月婷婷久久激情| 国产一区二区三区高清在线观看| 狠狠久久五月精品中文字幕| 亚洲国产精品免费| 国产日本欧美视频| 7m精品福利视频导航| 日韩欧美在线观看视频| 国产精品久久久久久久久免费看| 国产精品视频一| 亚洲欧美日韩精品久久奇米色影视| 国产性色av一区二区| 91精品国产色综合久久不卡98| 神马国产精品影院av| 在线观看精品自拍私拍| 欧美在线观看网站| 国产小视频91| 久久精品成人欧美大片| 黄色成人av在线| 国产精品欧美亚洲777777| 欧美另类xxx| 97视频在线观看视频免费视频| 日韩精品免费综合视频在线播放| 在线观看欧美日韩| 亚洲男人天堂久| 久久精品国产2020观看福利| 日韩专区在线观看| 日韩中文娱乐网| 亚洲最新av在线| 欧美华人在线视频| 国产精品久久9| 欧美日韩中文字幕日韩欧美| 亚洲欧美在线免费观看| 欧美精品日韩三级| 欧美性猛交xxxx乱大交3| 91香蕉嫩草神马影院在线观看| 麻豆乱码国产一区二区三区| 日韩欧美国产网站| 2018中文字幕一区二区三区| 日韩中文字幕网址| 国产亚洲日本欧美韩国| 黄色成人av网| 精品国产乱码久久久久久虫虫漫画| 日韩的一区二区| 97香蕉超级碰碰久久免费软件| 亚洲欧美另类自拍| 成人国产精品一区| 久久久久久久影视| 日韩中文字幕在线视频播放| 亚洲美女又黄又爽在线观看| 欧美大片第1页| 亚洲视频在线观看网站| 91久久久久久久| 日韩电影在线观看永久视频免费网站| 国产免费一区二区三区在线观看| 9.1国产丝袜在线观看| 日韩免费av在线| 国产精品自产拍高潮在线观看| 久99九色视频在线观看| 久久精品国产96久久久香蕉| 欧美特级www| 国产午夜精品一区二区三区| 成人午夜激情免费视频| 深夜福利亚洲导航| 国产网站欧美日韩免费精品在线观看| 7777kkkk成人观看| 国产精品高潮呻吟视频| 亚洲日本中文字幕| 亚洲国产小视频在线观看| 在线观看国产成人av片| 国产欧美日韩免费看aⅴ视频| 亚洲第一福利在线观看| 精品无人国产偷自产在线| 亚洲一区二区三区在线视频| 久久久视频免费观看|