亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ruby迭代map的簡潔寫法實現原理分析

2019-10-26 19:24:07
字體:
來源:轉載
供稿:網友

簡便方法的用法

現有一個字符串列表,需要對其中的每個字符串執行轉換大寫操作,我們可以用一個簡便寫法來完成。
代碼如下:
name_list = ["chareice", "angel"]
name_list.map(&:upcase)
# => ["CHAREICE", "ANGEL"]

這個寫法等同于
代碼如下:
name_list.map do {|name| name.upcase}

簡便寫法帶來的是很明顯的效率提升,可是這看似魔術一般的參數,背后的原理是怎樣的呢?

&符號

如果把上面方法調用的&符號去掉,可以很明顯得看到,是把:upcase這個符號傳到方法中,作為方法的參數。

實際上,&符號代表的是塊轉變為Proc(block-to-proc conversion)。我們看下面的一個例子。
代碼如下:
def capture_block(&block)
  block.call
end

capture_block { puts "我有一只小毛驢,我從來也不騎。" }
# => 我有一只小毛驢,我從來也不騎。

我們運行capture_block函數,給它傳遞一個代碼塊,代碼塊會經&符號的轉換變為一個Proc對象傳遞到函數中,在上面的例子中就是block變量。如果我們輸出一下block的class,輸出的結果會是Proc。

你也可以將一個Proc對象傳遞給capture_block來代替代碼塊.
代碼如下:
p = Proc.new { puts "又給一只小毛驢" }
capture_block(&p)
# => 又給一只小毛驢

這里看來&符號是多余的,完全可以去掉&,運行的結果也是一樣。

&符號做了什么?

以capture_block(&p)調用為例。

1.觸發p的to_proc方法。
2.告訴Ruby解釋器,將to_proc方法返回的結果當做本次函數調用的block。

如果同時使用了&符號和傳入了block給一個函數,Ruby會報錯。
代碼如下:
capture_block(&p) { puts "傳給一個block" }
#=>SyntaxError: (irb):30: both block arg and actual block given

所以將一個Proc對象傳給&符號,它會調用Proc對象的to_proc方法,返回它自己,然后把它當做方法調用的block傳遞給方法。

&:upcase是什么?

知道了&符號的作用后,我們可以看到,&:upcase是先調用了:upcase對象的to_proc方法。

:upcase的to_proc方法實現如下:
代碼如下:
class Symbol
  def to_proc
    Proc.new {|obj| obj.send(self) }
  end
end

這下結果就很清楚了,Symbol#to_proc會返回一個帶參數的Proc對象,Proc對象所做的是為使用這個Proc對象的對象發送調用名字為該符號的方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av在线播放资源| 一区二区成人av| 国内精品久久久久久久久| 日韩精品免费综合视频在线播放| 午夜精品久久久久久久99热浪潮| 精品美女久久久久久免费| 国产午夜精品美女视频明星a级| 日韩欧美主播在线| 国产精品看片资源| 亚洲欧洲激情在线| 亚洲高清久久久久久| 亚洲欧美日韩精品久久奇米色影视| 综合国产在线视频| 91av在线播放视频| 色天天综合狠狠色| 在线观看免费高清视频97| 亚洲男人天堂视频| 日本精品一区二区三区在线| 久久久免费观看| 亚洲欧美一区二区三区四区| 一夜七次郎国产精品亚洲| 国产91精品网站| 欧亚精品中文字幕| 九色精品美女在线| 国内精品久久影院| 国产日韩精品一区二区| 高清视频欧美一级| 日韩av电影在线播放| 中文国产成人精品| 91久久国产精品| 亚洲男人天堂九九视频| 国产精品一区二区三区久久久| 国产精品一久久香蕉国产线看观看| 亚洲图片制服诱惑| 久久久极品av| 亚洲精品国产成人| 日本不卡高字幕在线2019| 国产精品极品在线| 国产成+人+综合+亚洲欧美丁香花| 视频在线观看一区二区| 51午夜精品视频| 亚洲视频在线观看视频| 亚洲日本欧美日韩高观看| 韩国精品久久久999| 精品呦交小u女在线| 亚洲va国产va天堂va久久| 欧美成人午夜激情在线| 国产z一区二区三区| 亚洲在线一区二区| 国产欧美最新羞羞视频在线观看| 欧美激情精品久久久久久大尺度| 国产精品久久久久久久久久久不卡| 欧美激情欧美激情| 久久影院资源站| 91免费看国产| 日韩精品在线视频美女| 91国内产香蕉| 亚洲国产一区自拍| 久久久国产一区二区三区| 成人淫片在线看| 欧美综合国产精品久久丁香| 精品国产999| 国产在线视频欧美| 久久久久久久999精品视频| 精品亚洲男同gayvideo网站| 亚洲精品自拍第一页| 精品国产1区2区| 成人信息集中地欧美| 国产一区二区黄| 97超级碰碰碰久久久| 欧美性猛交99久久久久99按摩| 性欧美亚洲xxxx乳在线观看| 国产91成人video| 亚洲精品一二区| 欧美国产日韩二区| 91免费人成网站在线观看18| 国产精品夜间视频香蕉| 国产精品久久999| 色午夜这里只有精品| 国产精品高清免费在线观看| 久久久人成影片一区二区三区观看| 国产成+人+综合+亚洲欧洲| 午夜精品一区二区三区在线播放| 国产亚洲精品91在线| 欧美日韩人人澡狠狠躁视频| 亚洲欧美综合区自拍另类| 国产一区二区三区欧美| 日韩av手机在线看| 国产久一一精品| 亚洲欧美中文日韩在线| 亚洲人成自拍网站| 国产精品午夜国产小视频| 九色成人免费视频| 亚洲精品视频在线播放| 91欧美精品成人综合在线观看| 7777精品久久久久久| 91精品国产网站| 欧美性20hd另类| 欧美在线一级va免费观看| 欧美色播在线播放| 韩国三级日本三级少妇99| 亚洲人成在线观| 亚洲娇小xxxx欧美娇小| 亚洲午夜小视频| 7777kkkk成人观看| 亚洲精品有码在线| 91国内免费在线视频| 97人洗澡人人免费公开视频碰碰碰| 欧美激情视频网| 久久99国产精品自在自在app| 久久久久久中文字幕| 成人激情视频网| 久久这里只有精品视频首页| 亚洲成色777777女色窝| 精品香蕉在线观看视频一| 69av成年福利视频| 久久久在线免费观看| 国产噜噜噜噜久久久久久久久| 亚洲精品一区二区网址| 国产精品欧美日韩一区二区| 欧美性猛交丰臀xxxxx网站| 欧美日韩国产va另类| 国产精品激情av在线播放| 精品国产视频在线| 日韩在线免费观看视频| 欧美猛少妇色xxxxx| 88xx成人精品| 欧美孕妇毛茸茸xxxx| 国产日韩欧美视频| 日韩大片在线观看视频| 国产精品99久久久久久www| 精品国产自在精品国产浪潮| 国产免费成人av| 91精品国产综合久久香蕉922| 久久久国产精品亚洲一区| 国产欧美一区二区| 国产精品精品视频一区二区三区| 国产一区二区视频在线观看| 亚洲精品综合久久中文字幕| 欧美专区日韩视频| 久久婷婷国产麻豆91天堂| 国产日韩在线精品av| 亚洲天堂av在线免费| 欧美日韩在线免费观看| 中文字幕视频在线免费欧美日韩综合在线看| 色综合伊人色综合网| 中文字幕亚洲无线码在线一区| 国产精品99导航| 6080yy精品一区二区三区| 国产精品一区二区久久久| 国产精品欧美一区二区| 最近中文字幕2019免费| 91精品国产电影| 欧美超级免费视 在线| 国产精品三级网站| 色先锋资源久久综合5566| 国产精品草莓在线免费观看| 中文字幕亚洲情99在线| 97在线看免费观看视频在线观看| 亚洲精品日韩激情在线电影| 国产精品白丝jk喷水视频一区| 国产激情久久久久| 久久av.com| 中文字幕少妇一区二区三区|