2011-04-25 38 views
1

解釋這段代碼,我學習使用watchr,紅寶石的寶石,手錶文件,如果他們改變請從watchr

watch('test/test_.*\.rb') {|md| system("ruby #{md[0]}") } 
watch('lib/(.*)\.rb')  {|md| system("ruby test/test_#{md[1]}.rb") } 

具體來說,我不明白是什麼md[0]md[1]是運行的東西。我知道'test/tests_.*\.rb'是一個正則表達式,它檢索文件列表。我也知道|md|表示與正則表達式匹配的文件名。但我不確定什麼md[0]md[1]會指向

+0

'md'是最有可能一個'Array'或真實實現的'[]'方法的類(因此,'[0]'是指到該陣列的第一個元素)。做一個'md.class.name','md [0] .class.name'並從那裏出發? – Zabba 2011-04-25 05:54:47

回答

0

Ruby的正則表達式運算符(=〜)返回響應的對象:[]。值0和1表示匹配的字符串和第一組(圓括號中的部分)。

因此,例如,如果被測試的字符串是:

"test/test_sample.rb" 
"lib/sample.rb" 

然後,第一表達式(/test/test_.*.rb/)將匹配「測試/ test_sample.rb」,並且所述第二表達(/lib/(.*).rb/)會匹配「sample」。您可以在控制檯中看到這一點:

> /test\/test_.*\.rb/ =~ "test/test_sample.rb" 
# => 0 
> $~[0] 
# => "test/test_sample.rb" 
> /lib\/(.*)\.rb/ =~ "lib/sample.rb" 
# => 0 
> $~[0] 
# => "lib/sample.rb" 
> $~[1] 
# => "sample" 

md代表MatchData,這是該對象的類的紅寶石使用返回正則表達式匹配的結果。

1

我懷疑mdMatchData例如,當它[0]整個匹配的文本和[1]是捕獲的第一子表達),在這種情況下,lib目錄內的文件名,不包括擴展名。