欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Ruby中的代碼塊對(duì)象Proc

 更新時(shí)間:2016年05月27日 15:18:11   投稿:goldensun  
在Ruby中一個(gè)代碼塊block不是對(duì)象,但可以用Proc來(lái)替代其作為對(duì)象進(jìn)行操作,接下來(lái)我們就來(lái)詳解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)文章

最新評(píng)論