佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 詳解Ruby中的代碼塊對(duì)象Proc

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

熱門(mén)標(biāo)簽:硅谷的囚徒呼叫中心 呼叫中心市場(chǎng)需求 企業(yè)做大做強(qiáng) 語(yǔ)音系統(tǒng) 百度AI接口 電話運(yùn)營(yíng)中心 客戶服務(wù) Win7旗艦版

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ù)傳遞

標(biāo)簽:崇左 山西 長(zhǎng)沙 山西 濟(jì)南 海南 安康 喀什

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解Ruby中的代碼塊對(duì)象Proc》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    凌海市| 玉山县| 香河县| 阳曲县| 宁晋县| 沁源县| 阳城县| 南充市| 六安市| 伊宁县| 湛江市| 开鲁县| 和政县| 鹤峰县| 镇安县| 绥芬河市| 聂拉木县| 德安县| 宜宾市| 宽城| 霍州市| 正安县| 涿州市| 教育| 玛多县| 辽阳市| 桦甸市| 秦安县| 亚东县| 子洲县| 平乐县| 阜南县| 抚宁县| 柳江县| 乌兰察布市| 濮阳县| 冀州市| 黎川县| 鹤壁市| 隆林| 桐乡市|