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

Ruby中的Proc類及Proc的類方法Proc.new的使用解析

 更新時(shí)間:2016年05月27日 15:35:40   作者:imxieke  
用Proc類可以用Proc.new來創(chuàng)建一個(gè)Proc類,進(jìn)而來操作塊,這里我們就來進(jìn)行Ruby中的Proc類及Proc的類方法Proc.new的使用解析.

Proc是對(duì)塊及其context(局部變量的作用域以及??蚣?進(jìn)行對(duì)象化處理之后得到的過程對(duì)象。您可以像使用無名函數(shù)那樣來使用Proc,但它不會(huì)導(dǎo)入局部變量的作用域(可以把動(dòng)態(tài)局部變量用作Proc局部變量)。

在下例中,正因?yàn)镻roc一直保持著局部變量的作用域,所以才能調(diào)用var變量。

var = 1
$foo = Proc.new { var }
var = 2

def foo
 $foo.call
end

p foo    # => 2

從生成Proc的方法中返回以后,若Proc中出現(xiàn)return或retry的話,會(huì)引發(fā)LocalJumpError異常。

def foo
 proc { return }
end

foo.call
# => in `call': return from proc-closure (LocalJumpError)

def foo
 proc { retry }
end

foo.call
# => in `call': retry from proc-closure (LocalJumpError)

若在Proc前面加上"&"并將其傳給一個(gè)帶塊的方法時(shí),其運(yùn)作情形類似于調(diào)用塊。但從嚴(yán)格意義上講,其間還存在以下不同。

# 沒問題
(1..5).each { break }

# 在ruby 1.6.7, 1.8中沒問題。在1.6.8中則發(fā)生異常
proc = Proc.new { break }
(1..5).each(&proc)

# 在ruby 1.6 中是 LocalJumpError
# 在ruby 1.8 中,再次運(yùn)行each
proc = Proc.new { retry }
(1..5).each(&proc)
#=> retry from proc-closure (LocalJumpError)

這正是Proc對(duì)象用作調(diào)用塊時(shí)的限制。

Proc.new
Proc.new { ... }

對(duì)塊及其context進(jìn)行對(duì)象化處理之后返回結(jié)果。

若沒有給出塊的話,就會(huì)把調(diào)用該方法的方法所帶的塊轉(zhuǎn)換為Proc對(duì)象并將其返回。

def foo
  pr = Proc.new
  pr.call(1,2,3)
end
foo {|args| p args }
# => [1, 2, 3]

Proc.new方法深入
Proc.new對(duì)塊及其context進(jìn)行對(duì)象化處理之后返回結(jié)果。

若沒有給出塊的話,就會(huì)把調(diào)用該方法的方法所帶的塊轉(zhuǎn)換為Proc對(duì)象并將其返回。

def foo
  pr = Proc.new
  pr.call(1,2,3)
end
foo {|args| p args }
# => [1, 2, 3]
這與下例相同
def foo
 yield(1,2,3)
end
foo {|args| p args }
# => [1, 2, 3]

若主調(diào)方法并沒有帶塊時(shí),則引發(fā)ArgumentError異常。

def foo
 Proc.new
end
foo
# => -:2:in `new': tried to create Proc object without a block (ArgumentError)
     from -:2:in `foo'
     from -:4

在使用Proc.new時(shí),若定義了Proc#initialize方法的話,就在對(duì)象初始化時(shí)調(diào)用該方法。除此以外,它和proc是相同的。

利用 Proc.new 方法,或者對(duì) proc 方法指定塊,都可以創(chuàng)建代表塊的 Proc 對(duì)象。

通過調(diào)用 Proc#call 方法執(zhí)行塊。調(diào)用 Proc#call 方法時(shí)的參數(shù)會(huì)作為塊變量,塊中最后一個(gè)表達(dá)式的值則為 Proc#call 的返回值。Proc#call 還有一個(gè)名稱叫 Proc#[]。

# 判斷西歷的年是否為閏年的處理
leap = Proc.new do |year|
 year % 4 == 0 && year % 100 != 0 || year % 400 ==0
end
 
p leap.call(2000)  #=> true
p leap[2013]     #=> false
p leap[2016]     #=> true

將塊變量設(shè)置為 |* 數(shù)組 | 的形式后,就可以像方法參數(shù)一樣,以數(shù)組的形式接收可變數(shù)量的參數(shù)。

double = Proc.new do |*args|
 args.map{|i| i * 2 }  # 所有元素乘兩倍
end
 
p double.call(1, 2, 3)  #=> [2, 3, 4]
p double[2, 3, 4]     #=> [4, 6, 8]

除此以外,定義普通方法時(shí)可使用的參數(shù)形式,如默認(rèn)參數(shù)、關(guān)鍵字參數(shù)等,幾乎都可以被用于塊變量的定義,并被指定給 Proc#call 方法。

相關(guān)文章

  • Ruby中的變量學(xué)習(xí)總結(jié)

    Ruby中的變量學(xué)習(xí)總結(jié)

    這篇文章主要介紹了Ruby中的變量學(xué)習(xí)總結(jié),本文詳細(xì)講解了Ruby中的局部變量、實(shí)例變量、類變量、全局變量等4種變量類型,并對(duì)它們的作用范圍做了總結(jié),需要的朋友可以參考下
    2014-11-11
  • windows下安裝ruby與rails時(shí)遇到的問題總結(jié)

    windows下安裝ruby與rails時(shí)遇到的問題總結(jié)

    這篇文章主要總結(jié)了windows下安裝ruby與rails時(shí)遇到的問題,本文總結(jié)的問題都是通過自己實(shí)踐所得來的,總結(jié)的還算是相對(duì)比較全面,需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。
    2017-04-04
  • Ruby創(chuàng)建“關(guān)鍵字”同名方法別名的方法

    Ruby創(chuàng)建“關(guān)鍵字”同名方法別名的方法

    這篇文章主要介紹了Ruby創(chuàng)建“關(guān)鍵字”同名方法別名的方法,本文提示的是一個(gè)小技巧,特殊場(chǎng)景時(shí)可能會(huì)用到,需要的朋友可以參考下
    2015-01-01
  • Ruby簡(jiǎn)明教程之判斷語句介紹

    Ruby簡(jiǎn)明教程之判斷語句介紹

    這篇文章主要介紹了Ruby簡(jiǎn)明教程之判斷語句介紹,非常簡(jiǎn)潔的講解,可以作為語法備忘,需要的朋友可以參考下
    2014-06-06
  • Ruby on Rails中的ActiveRecord編程指南

    Ruby on Rails中的ActiveRecord編程指南

    這篇文章主要介紹了Ruby on Rails中的ActiveRecord編程指南,作者對(duì)編寫ActiveRecord的通用習(xí)慣給出了建議,需要的朋友可以參考下
    2015-08-08
  • Linux下Redis數(shù)據(jù)庫的安裝方法與自動(dòng)啟動(dòng)腳本分享

    Linux下Redis數(shù)據(jù)庫的安裝方法與自動(dòng)啟動(dòng)腳本分享

    這篇文章主要介紹了Linux下Redis數(shù)據(jù)庫的安裝方法與自動(dòng)啟動(dòng)腳本分享,自動(dòng)啟動(dòng)腳本分別針對(duì)CentOS和Ubuntu系統(tǒng)來給出了編寫示例,需要的朋友可以參考下
    2016-05-05
  • 更改RubyGem安裝源

    更改RubyGem安裝源

    RubyGem默認(rèn)源安裝太慢,修改為國(guó)內(nèi)淘寶源
    2014-07-07
  • 最新評(píng)論