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ì)念上幾句。
您可能感興趣的文章:- 深入理解Ruby中的代碼塊block特性
- Ruby中的block代碼塊學(xué)習(xí)教程
- 詳解Ruby中的代碼塊及其參數(shù)傳遞