2013-05-19 19 views
-2

比方說,使用陣列的delete_if命令

script = Array.new 
script.push("/home/dexter/constant.sh") 
script.push("/home/dexter/constant_validation.rb") 
script.push("/home/dexter/jobs/reporter.rb") 

現在,當我使用陣列的方法delete_if,

script.compact.delete_if {|s| s =~ /constant/} 

這應該刪除從陣列含有 「恆定」 的元素。這是我在交互式ruby下執行它時得到的輸出。

puts script => ["/home/dexter/jobs/reporter.rb"] 

我正通過正則表達式匹配將元素推入數組中。

任何想法我做錯了什麼?

乾杯。

+2

當你把它放在腳本中時你會得到什麼結果? – Achrome

+0

@AshwinMukhija放入代碼時,delete_if似乎無效。在腳本數組上運行delete_if後,我得到 'puts script => [「/home/dexter/constant.sh","/home/dexter/constant_validation.rb","/home/dexter/jobs/reporter.rb 「]' – D3XT3R

回答

0

好了..所以我在腳本中犯的錯誤是,

我正在腳本數組中添加元素到我的腳本中的正則表達式的幫助。 所以當我做了一個類檢查數組的元素,我發現他們的類型是「MatchData」,因此delete_if沒有工作。

1

雖然delete_if是破壞性的,工作的消息接收器,因爲您使用compact方法,從self返回不同的實例,該實例發送delete_if消息,從script不同。

因此,如果您運行script.compact!,然後script.delete_if,則會得到期望的結果。

沒有delete_if!因爲delete_if本身修改self

+0

即使我不使用壓縮像script.delete_if我沒有得到它是正確的 – D3XT3R

+0

'compact!'返回'nil'如果沒有更改被做 – Stefan

+0

然後,不應該依靠返回值然後.. – shigeya

0
script = Array.new 
script.push("/home/dexter/constant.sh") 
script.push("/home/dexter/constant_validation.rb") 
script.push("/home/dexter/jobs/reporter.rb") 

script 
#=> ["/home/dexter/constant.sh", 
"/home/dexter/constant_validation.rb", 
"/home/dexter/jobs/reporter.rb"] 

正如@shigeya上面所說的,compact回報self不同實例。您可以驗證爲:

script.object_id 
#=>72421740 
script.compact.object_id 
#=> 71512710 

這樣,通過使用鏈與compactdelete_if,你是通過script.compact返回的對象陣列上進行更改,而不是script本身,

​​
0

如果你想這樣做的一條線就需要像:

script.tap{|s| s.compact}.delete_if {|s| s =~ /constant/} 

否則你的改變不會影響script

+0

謝謝你有效的答案..試圖增加你的聲望,但看起來我需要15分鐘才能做到這一點。無論如何,感謝您的幫助。 – D3XT3R