詳解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對象進行轉(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)也犯過這樣的錯誤就是因為沒有把block和proc正確的區(qū)分開來, &p是block, p是proc,不到萬不得已的情況下不要顯式地創(chuàng)建proc,每當(dāng)我對block和proc之間的關(guān)系犯糊涂時,我就會念上幾句。
相關(guān)文章
win7安裝ruby on rails開發(fā)環(huán)境
看到很多文章都說ruby環(huán)境在windows上是非常難搭建,會出現(xiàn)各種各樣的怪問題,所以都推薦到linux和mac上安裝開發(fā)。但是我按照教程搭了下,問題也不算太多。總過大概花費了2個半小時左右就完成了。下面就把安裝的步驟及具體的版本記錄了一下供大家參考。2014-07-07
Ruby中g(shù)em包管理器的用法及用bundler來管理多版本的gem
gem是Ruby環(huán)境中的包管理器,好比于Python中的pip與JavaScript本地Node.js的npm,非常有名和強大,下面就來看一下Ruby中g(shù)em包管理器的用法及用bundler來管理多版本的gem的方法:2016-05-05

