詳解Ruby中的代碼塊對象Proc
Proc對象
Proc是由塊轉(zhuǎn)換來的對象。創(chuàng)建一個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
除了上面的四種之外,還有一種通過&操作符的方式,將代碼塊與Proc對象進(jìn)行轉(zhuǎn)換。如果需要將某個代碼塊作為參數(shù)傳遞給方法,需要通過為這個參數(shù)添加&符號,并且其位置必須是在參數(shù)的最后一個
&符號的含義是: 這是一個Proc對象,我想把它當(dāng)成代碼塊來使用。去掉&符號,將能再次得到一個Proc對象。
示例代碼
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時,我會忽略proc的存在,我將proc定位為一個幕后的工作者。我經(jīng)常寫類似下面的代碼,
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
有些新手會寫類似下面的一執(zhí)行就會報錯的代碼,
def f(..., &p) instance_eval p end def f(..., p) instance_eval p.call end
也有這樣寫的,
def f(..., &p) instance_eval do p.call end end
或者
def f(...) instance_eval do yield end end
我甚至寫過類似下面的代碼,
def f(...) instance_eval yield end
我們經(jīng)常在該掛block的時候,卻把proc對象當(dāng)參數(shù)傳給方法了, 或者不明白&p就是block可以直接交給方法使用,我曾經(jīng)也犯過這樣的錯誤就是因?yàn)闆]有把block和proc正確的區(qū)分開來, &p是block, p是proc,不到萬不得已的情況下不要顯式地創(chuàng)建proc,每當(dāng)我對block和proc之間的關(guān)系犯糊涂時,我就會念上幾句。
相關(guān)文章
Ruby和Shell腳本實(shí)現(xiàn)判斷成績及格功能
這篇文章主要介紹了Ruby和Shell腳本實(shí)現(xiàn)判斷成績及格功能,使用Ruby實(shí)現(xià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實(shí)現(xiàn)命令行中查看函數(shù)源碼的方法
這篇文章主要介紹了Ruby實(shí)現(xiàn)命令行中查看函數(shù)源碼的方法,,需要的朋友可以參考下2014-07-07對Ruby on Rails進(jìn)行高效的單元測試的教程
這篇文章主要介紹了在Ruby on Rails中進(jìn)行高效的單元測試的教程,使用到了Ruby的RSpec和Factory Girl框架,需要的朋友可以參考下2015-04-04使用RVM實(shí)現(xiàn)控制切換Ruby/Rails版本
RVM 是Ruby Version Manager的縮寫,是一個命令行工具,它可以讓你輕松地安裝,管理和使用多個版本的Ruby.不同的rails項(xiàng)目使用等ruby和rails版本不一樣的時候,可以使用RVM自由切換。2017-06-06