国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

深入理解Ruby中的block概念

2019-10-26 19:26:22
字體:
來源:轉載
供稿:網友

Ruby 里的 block一般翻譯成代碼塊,block 剛開始看上去有點奇怪,因為很多語言里面沒有這樣的東西。事實上它還不錯。
First-class function and Higher-order function

First-class function 和 Higher-order function 是函數式編程語言里面的概念,聽起來好像很高端的樣子,其實很很簡單的。

First-class functions 是指在某些語言里,函數是一等公民,可以把函數當做參數傳遞,
可以返回一個函數,可以把函數賦值個一個變量等等,反正就是正常值能做的事函數都能做。JavaScript 就是這樣的。舉個例子(下面的所有例子里,當我提到
JavaScript 時,示例代碼都用的 CoffeeScript):

greet = (name) -> return -> console.log "Hello, #{name}"greetToMike = greet("Mike")greetToMike() # => 輸出 "Hello, Mike"a = greetToMikea() # => 輸出 "Hello, Mike"

在上面的第四行里,greet("Mike") 返回了一個函數,所以第五行里才可以調用 greetToMike()輸出"Hello, Mike"。第六行把一個函數賦值給了a,所以第七行就可以調用這個函數了。

higher-order function 一般翻譯成高階函數,是指接受函數做參數或者返回函數的函數。
舉個非常常用的例子(用 JavaScript):

a = [ "a", "b", "c", "d" ]a.map((x) -> x + '!') #=> ["a!", "b!", "c!", "d!"]

上面例子里 map 就接受了一個匿名函數作為參數。Array.prototype里的很多方法,比如reduce, filter,every, some 等等都是高階函數,因為他們都接受函數作為參數。

高階函數非常強大,表達力很強,可以避免大量重復代碼??偟膩碚f,它就是個好東西。
Block 的本質

先來看一組 Ruby 和 CoffeeScript 代碼的對比。

a = [ "a", "b", "c", "d" ]a.map { |x| x + "!" } # => ["a!", "b!", "c!", "d!"]a.reduce { |acc, x| acc + x} # => "abcd"a = [ "a", "b", "c", "d" ]a.map((x) -> x + '!') # => ["a!", "b!", "c!", "d!"]a.reduce((acc, x) -> acc + x) # => "abcd"

這兩組代碼真的看起來超級像。我覺得這也暴露了 Ruby 的 block 的本質:高階函數的函數參數的變體。

JavaScript 里面的map 函數接受一個函數作為參數,但是 Ruby 里的 map 卻接受一個
block 作為參數。

其實 matz 早在一本書里《松本行弘的程序世界》里說了:

代碼如下:    最終來看,塊到底是什么?
    ...
    塊也可以看作只是高階函數的一種特殊形式的語法。
    ...
    高階函數和塊的本質一樣
    ...

在 Ruby 里,函數不是一等公民,沒有 first-class functions。但是在 Ruby
里怎樣使用高階函數呢?答案就是使用 block??梢灾苯佑?block,也可以用 lambda

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 岚皋县| 云浮市| 伊宁市| 吕梁市| 额济纳旗| 抚远县| 崇礼县| 临高县| 铁力市| 玉龙| 洞口县| 岳池县| 博白县| 南平市| 娄底市| 宝山区| 行唐县| 东丽区| 泌阳县| 寿阳县| 久治县| 蕲春县| 和平区| 桂平市| 天峻县| 遵义市| 柞水县| 盐池县| 荃湾区| 宣化县| 当涂县| 大足县| 陇川县| 剑河县| 涟水县| 青铜峡市| 张家港市| 巨鹿县| 通道| 秀山| 祥云县|