2011-07-13 67 views
2

我正在經歷Beginning Ruby從新手到專業版第2版,目前在第49頁,我們正在學習RegEx基礎知識。書中的每個正則表達式片段都有一個沒有解釋過的代碼。此Ruby/RegEx代碼做什麼?

{ |x| puts x } 

在背景:

"This is a test".scan(/[a-m]/) { |x| puts x } 

可能有人請給我介紹?

回答

2

scan的方法是一個迭代;在這種情況下,每次匹配正確的正則表達式時,scan執行程序員指定的某些操作。在Ruby中,「東西」表示爲,由{ code }do code end(具有不同的優先級)表示,其作爲特殊參數傳遞給方法。一個塊可以以參數列表(和局部變量)開始,它是|x|部分; scan使用與其匹配的字符串調用塊,該字符串在塊內綁定到x。 (此語法來自Smalltalk中。)

因此,在這種情況下,將scan每次調用其塊參數/[a-m]/匹配,這意味着上am之間的字符串中的每個字符。

+0

感謝geekosaur,這次點擊了!還是要再讀幾遍。 – Learning

1

它打印所有的字母am之間的字符串:http://ideone.com/lKaoI

|x| puts x是annonymouse功能(或「塊」,在Ruby中,據我所知,或在其他語言拉姆達),打印它的參數。

+0

我想他在問什麼'{| x |把x}'做。我不知道Ruby,但我只能假設它打印出正則表達式。 – switz

+0

@Switz - 我正在接近它,花了我相當長的時間才弄清楚它是如何在Ruby中調用的,並找到了一些相關的參考。 – Kobi

+0

@Kobi你應該編輯你的答案,說「它打印給定字符串*之間的所有字母之間的a和m *之類的東西。閱讀你當前的答案是它打印'abcdefghijklm'只是說'': - ) –

0

{ |x| puts x }定義了一個新塊接受名爲x一個參數:
對更多信息可以在被發現。當該塊被調用時,它將其參數x傳遞給puts

另一種方式來寫同樣的事情將是:

"This is a test".scan(/[a-m]/) do |x| 
    puts x 
end 

塊得到由scan功能每個正則表達式匹配字符串的東西時被調用,因此每場比賽將得到打印。

有關於塊這裏的詳細信息: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_containers.html

+0

非常感謝大衛! – Learning

1

在你的書上的例子而言,它包括每個表達式後,因爲它只是意味着「打印出每一場比賽。

這是一個code block,這對於正則表達式的每場比賽中運行。

{ }創建代碼塊。

|x|創建用於代碼塊

puts打印出字符串中的參數,x是它打印的字符串。

正則表達式匹配字符類[a-m]中的任何單個字符。因此,有五個不同的比賽,和它打印出:

h 
i 
i 
a 
e 
+0

謝謝Renesis! – Learning

1

輸出是

h 
i 
i 
a 
e 

字符串的每個字符「這是一個測試」是針對正則表達式[a-m]這意味着檢查「只是a..m範圍內的一個字符,如果其匹配,則會自行打印(通過puts)。第一個字符T不匹配,第二個h匹配等。最後一個字符是e在「測試」中。

+0

感謝Ray的幫助! – Learning