国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Ruby > 正文

詳解Ruby中的代碼塊對象Proc

2020-10-29 19:35:19
字體:
來源:轉載
供稿:網友

Proc對象

Proc是由塊轉換來的對象。創建一個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對象進行轉換。如果需要將某個代碼塊作為參數傳遞給方法,需要通過為這個參數添加&符號,并且其位置必須是在參數的最后一個

&符號的含義是: 這是一個Proc對象,我想把它當成代碼塊來使用。去掉&符號,將能再次得到一個Proc對象。

示例代碼

def my_method(&the_proc)  the_procendp = my_method {|name| “Hello, #{name} !”}p.class  #=> Procp.call(“Bill”)  #=> “Hello,Bill”def my_method(greeting)  “#{greeting}, #{yield}!”endmy_proc = proc { “Bill” }my_method(“Hello”, &my_proc)

一些需要注意的地方

在使用block時,我會忽略proc的存在,我將proc定位為一個幕后的工作者。我經常寫類似下面的代碼,

 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

有些新手會寫類似下面的一執行就會報錯的代碼,

 

 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

我們經常在該掛block的時候,卻把proc對象當參數傳給方法了, 或者不明白&p就是block可以直接交給方法使用,我曾經也犯過這樣的錯誤就是因為沒有把block和proc正確的區分開來, &p是block, p是proc,不到萬不得已的情況下不要顯式地創建proc,每當我對block和proc之間的關系犯糊涂時,我就會念上幾句。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乌拉特后旗| 新源县| 双峰县| 陆川县| 新巴尔虎右旗| 门头沟区| 荣昌县| 定结县| 祁连县| 平泉县| 当阳市| 师宗县| 内黄县| 项城市| 南江县| 大方县| 澄江县| 寿宁县| 西昌市| 怀来县| 汉源县| 哈尔滨市| 鄂托克旗| 牟定县| 乡城县| 芒康县| 视频| 苍山县| 甘德县| 武川县| 安溪县| 辽宁省| 天气| 八宿县| 济阳县| 拜城县| 贺兰县| 隆尧县| 崇左市| 葵青区| 含山县|