我正在經歷Beginning Ruby從新手到專業版第2版,目前在第49頁,我們正在學習RegEx基礎知識。書中的每個正則表達式片段都有一個沒有解釋過的代碼。此Ruby/RegEx代碼做什麼?
{ |x| puts x }
在背景:
"This is a test".scan(/[a-m]/) { |x| puts x }
可能有人請給我介紹?
我正在經歷Beginning Ruby從新手到專業版第2版,目前在第49頁,我們正在學習RegEx基礎知識。書中的每個正則表達式片段都有一個沒有解釋過的代碼。此Ruby/RegEx代碼做什麼?
{ |x| puts x }
在背景:
"This is a test".scan(/[a-m]/) { |x| puts x }
可能有人請給我介紹?
如scan
的方法是一個迭代;在這種情況下,每次匹配正確的正則表達式時,scan
執行程序員指定的某些操作。在Ruby中,「東西」表示爲塊,由{ code }
或do code end
(具有不同的優先級)表示,其作爲特殊參數傳遞給方法。一個塊可以以參數列表(和局部變量)開始,它是|x|
部分; scan
使用與其匹配的字符串調用塊,該字符串在塊內綁定到x
。 (此語法來自Smalltalk中。)
因此,在這種情況下,將scan
每次調用其塊參數/[a-m]/
匹配,這意味着上a
和m
之間的字符串中的每個字符。
它打印所有的字母a
和m
之間的字符串:http://ideone.com/lKaoI
|x| puts x
是annonymouse功能(或「塊」,在Ruby中,據我所知,或在其他語言拉姆達),打印它的參數。
的{ |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
非常感謝大衛! – Learning
在你的書上的例子而言,它包括每個表達式後,因爲它只是意味着「打印出每一場比賽。」
這是一個code block,這對於正則表達式的每場比賽中運行。
{ }
創建代碼塊。
|x|
創建用於代碼塊
puts
打印出字符串中的參數,x
是它打印的字符串。
正則表達式匹配字符類[a-m]
中的任何單個字符。因此,有五個不同的比賽,和它打印出:
h
i
i
a
e
謝謝Renesis! – Learning
輸出是
h
i
i
a
e
字符串的每個字符「這是一個測試」是針對正則表達式[a-m]
這意味着檢查「只是a..m
範圍內的一個字符,如果其匹配,則會自行打印(通過puts
)。第一個字符T
不匹配,第二個h
匹配等。最後一個字符是e
在「測試」中。
感謝Ray的幫助! – Learning
感謝geekosaur,這次點擊了!還是要再讀幾遍。 – Learning