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

2022-10-04 23:42:17 字數 1525 閱讀 4724

簡便方法的用法

現有乙個字串列表,需要對其中的每個字串執行轉換大寫操作,我們可以用乙個簡便寫法來完成。

複製** **如下:

name_list = ["chareice", "angel"]

name_list.map(&:upcase)

# => ["chareice", "angel"]

這個寫法等同於

複製** **如下:

name_list.map do

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

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

實際上,&符號代表的是塊轉變為proc(block-to-proc conversion)。我們看下面的乙個例子。

複製** **如下:

def capture_block(&block)

block.call

endcapture_block

# => 我有乙隻小毛驢,我從來也不騎。

我們執行capture_block函式,給它傳遞乙個**塊,**塊會經&符號的轉換變為乙個proc物件傳遞到函式中,在上面的例子中就是block變數。如果我們輸出一下block的class,輸出的結果會是proc。

你也可以將乙個proc物件傳遞給capture_block來代替**塊.

複製** **如下:

p = proc.new

capture_block(&p)

# => 又給乙隻小毛驢

這裡看來&符號是多餘的,完全可以去掉&,執行的結果也是一樣。

&符號做了什麼?

以capture_block(&p)呼叫為例。

1.觸發p的to_proc方法。

2.告訴ruby直譯器,將to_proc方法返回的結果當做本次函式呼叫的block。

如果同時使用了&符號和傳入了block給乙個函式,ruby會報錯。

複製** **如下:

capture_block(&p)

#=>syntaxerror: (irb):30: both block arg and actual block given

所以將乙個proc物件傳給&符號,它會呼叫proc物件的to_proc方法,返回它自己,然後把它lga**sv當做方法呼叫的block傳遞給方法。

&:upcase是什麼?

知道了&符號的作用後,我們可以看到,&:upcase是先呼叫了:upcase物件的to_proc方法。

:upca程式設計客棧se的to_proc方法實現如下:

複製** **www.cppcns.com如下:

class symbol

def to_proc

proc.new

endend這下結果就很清楚了,symbol#to_proc會返回乙個帶引數的proc物件,proc物件所做的是為使用這個p物件的物件傳送呼叫名字為該符號的方法。

本文標題: ruby迭代map的簡潔寫法實現原理分析

本文位址:

freemarker中迭代Map的寫法

ftl檔案 如下 assign mymap stack.findvalue mymap list mymap?keys as key key value stack.findvalue mymap 這是struts2裡面的用法,可以查詢頁面中viewstack中的值,mymap是乙個map物件。my...

快速排序的簡潔寫法

個人總結的兩種寫法,比較傾向於partition1,乙個邊界畢竟比兩個邊界好控制。此處 基於c 其實也就是用了個vector而已,隨便改改其他語言都可以。好多寫法都可以滿足普通情況,但不滿足特殊用例測試 1,1,1,3這種。共享。include stdafx.h include iostream i...

ruby的迭代器

1 陣列的迭代器 ary 1,2,3,4,5,6,7 ary.each 或者可以用each do end的寫法 ary 1,2,3,4,5,6,7 ary.each do x puts x end 也可以用each with index來獲取每次訪問陣列的index ary 1,2,3,4,5,6,...