麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > 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之間的關系犯糊涂時,我就會念上幾句。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天堂成人一区二区三区 | 成人福利电影在线观看 | 夜夜b| 国产亚洲精品久久久久久久久久 | 成人午夜视频在线观看 | 久久亚洲一区二区三区成人国产 | 久久国产精品免费视频 | 91美女视频在线 | 日韩精品一区二 | 99国产精品白浆在线观看免费 | 国产美女一区二区在线观看 | 国产系列 视频二区 | 一区二区三区欧美日韩 | 最新亚洲视频 | 激情亚洲一区二区三区 | 欧美爱爱视频网站 | 成人免费午夜视频 | 国产精品自拍av | 日韩黄在线 | 国产在线精品一区二区夜色 | 牛牛碰在线 | 久久免费视频8 | 国产成年人网站 | 精品国产精品久久 | 国产精品久久久久久影视 | 日日噜噜夜夜爽 | 毛片视频网站 | 在线播放视频一区二区 | 亚洲精品午夜视频 | 91久久91久久精品免观看 | 亚洲第一黄色网 | 欧美18—19sex性hd按摩 | 国产一级毛片在线看 | 久久老司机精品视频 | 色综合狠狠| 在火车上摸两乳爽的大叫 | 中文字幕涩涩久久乱小说 | 免费黄色成人 | 日韩欧美电影一区二区三区 | 久久视频精品 | 日韩一级免费毛片 |