詳解Ruby中的代碼塊對(duì)象Proc
Proc對(duì)象
Proc是由塊轉(zhuǎn)換來(lái)的對(duì)象。創(chuàng)建一個(gè)Proc共有四種方法,分別是:
示例代碼
# 法一 inc = Proc.new { | x | x + 1} inc.call(2) #=> 3 # 法二 inc = lambda {| x | x + 1 } inc.call(2) #=> 3 # 法三 inc = ->(x) { x + 1} inc.call(2) #=> 3 # 法四 inc = proc {|x| x + 1 } inc.call(2) #=> 3
除了上面的四種之外,還有一種通過(guò)&操作符的方式,將代碼塊與Proc對(duì)象進(jìn)行轉(zhuǎn)換。如果需要將某個(gè)代碼塊作為參數(shù)傳遞給方法,需要通過(guò)為這個(gè)參數(shù)添加&符號(hào),并且其位置必須是在參數(shù)的最后一個(gè)
&符號(hào)的含義是: 這是一個(gè)Proc對(duì)象,我想把它當(dāng)成代碼塊來(lái)使用。去掉&符號(hào),將能再次得到一個(gè)Proc對(duì)象。
示例代碼
def my_method(&the_proc) the_proc end p = my_method {|name| “Hello, #{name} !”} p.class #=> Proc p.call(“Bill”) #=> “Hello,Bill” def my_method(greeting) “#{greeting}, #{yield}!” end my_proc = proc { “Bill” } my_method(“Hello”, &my_proc)
一些需要注意的地方
在使用block時(shí),我會(huì)忽略proc的存在,我將proc定位為一個(gè)幕后的工作者。我經(jīng)常寫(xiě)類似下面的代碼,
def f(...) ... yield ... end def f(..., &p) ... p.call ... end def f(..., &p) instance_eval &p ... end def f(..., &p) ... defime_method m, &p ... end
有些新手會(huì)寫(xiě)類似下面的一執(zhí)行就會(huì)報(bào)錯(cuò)的代碼,
def f(..., &p) instance_eval p end def f(..., p) instance_eval p.call end
也有這樣寫(xiě)的,
def f(..., &p) instance_eval do p.call end end
或者
def f(...) instance_eval do yield end end
我甚至寫(xiě)過(guò)類似下面的代碼,
def f(...) instance_eval yield end
我們經(jīng)常在該掛block的時(shí)候,卻把proc對(duì)象當(dāng)參數(shù)傳給方法了, 或者不明白&p就是block可以直接交給方法使用,我曾經(jīng)也犯過(guò)這樣的錯(cuò)誤就是因?yàn)闆](méi)有把block和proc正確的區(qū)分開(kāi)來(lái), &p是block, p是proc,不到萬(wàn)不得已的情況下不要顯式地創(chuàng)建proc,每當(dāng)我對(duì)block和proc之間的關(guān)系犯糊涂時(shí),我就會(huì)念上幾句。
相關(guān)文章
Ruby和Shell腳本實(shí)現(xiàn)判斷成績(jī)及格功能
這篇文章主要介紹了Ruby和Shell腳本實(shí)現(xiàn)判斷成績(jī)及格功能,使用Ruby實(shí)現(xiàn)這個(gè)功能非常簡(jiǎn)潔優(yōu)雅,而Shell的實(shí)現(xiàn)就比較傳統(tǒng)了,需要的朋友可以參考下2015-01-01mac及l(fā)inux下搭建ruby+rails環(huán)境
本文給大家分享了如何在mac以及Linux系統(tǒng)中安裝ruby+rails環(huán)境,非常詳細(xì),而且有圖有真相,希望大家能夠喜歡2017-11-11Ruby中嵌套對(duì)象轉(zhuǎn)換成json的方法
這篇文章主要介紹了Ruby中嵌套對(duì)象轉(zhuǎn)換成json的方法,同時(shí)介紹了普通對(duì)象to_json的方法,需要的朋友可以參考下2014-06-06Ruby中Time對(duì)象的常用函數(shù)總結(jié)
這篇文章主要介紹了Ruby中Time對(duì)象的常用函數(shù)總結(jié),包括Ruby中一些實(shí)用的時(shí)間算法,需要的朋友可以參考下2016-03-03介紹Ruby中的模塊與混合類型的相關(guān)知識(shí)
這篇文章主要介紹了Ruby中的模塊與混合類型的相關(guān)知識(shí),包括平常人們常說(shuō)的多態(tài)與繼承等相關(guān)知識(shí)點(diǎn),需要的朋友可以參考下2015-05-05Ruby實(shí)現(xiàn)命令行中查看函數(shù)源碼的方法
這篇文章主要介紹了Ruby實(shí)現(xiàn)命令行中查看函數(shù)源碼的方法,,需要的朋友可以參考下2014-07-07對(duì)Ruby on Rails進(jìn)行高效的單元測(cè)試的教程
這篇文章主要介紹了在Ruby on Rails中進(jìn)行高效的單元測(cè)試的教程,使用到了Ruby的RSpec和Factory Girl框架,需要的朋友可以參考下2015-04-04使用RVM實(shí)現(xiàn)控制切換Ruby/Rails版本
RVM 是Ruby Version Manager的縮寫(xiě),是一個(gè)命令行工具,它可以讓你輕松地安裝,管理和使用多個(gè)版本的Ruby.不同的rails項(xiàng)目使用等ruby和rails版本不一樣的時(shí)候,可以使用RVM自由切換。2017-06-06