2013-01-03 46 views
3

我正在開發一個應用程序,我堅持使用下面的代碼。使用Map和Select方法遍歷數組在Ruby中一起使用

我有一個鏈接數組,其中包含用戶在窗體中張貼的一些鏈接。 說例如我的數組是bunch1 = ["google.com","http://yahoo.com"]

現在,在我將它們存儲到數據庫之前,我需要確保每個鏈接在開始時都添加了「http://」,因爲我在ActiveRecord中有'驗證:'邏輯目的。

所以我的邏輯是,我將遍歷數組,並檢查數組中的每個鏈接之前是否存在「http://」字符串段。很顯然,我必須在我的數組中的「google.com」之前添加「http://」字符串片段。

所以我寫了這樣的代碼:

bunch2=bunch1.map { |y| y="http://"+y } 

但它創建了一個bunch2陣列狀bunch2 = 「http://google.com」,「HTTP:// HTTP://雅虎.com「]

正如您所見,它在」http://yahoo.com「之前添加了一個額外的」http://「。

爲了解決這個問題我修改上面的這樣的代碼:

bunch2 = bunch1.select { |x| x !~ /http/ }.map { |y| y="http://"+y } 

但它產生像 bunch2 = ["http://google.com"]一個數組,因爲與select方法的正則表達式被消除yahoo.com

燦有人請給我解決這個問題。在此先感謝...

回答

5

爲什麼不在測試map的電話?

bunch2 = bunch1.map {|y| y !~ /^http/ ? "http://#{y}" : y }

+0

我複製了你的代碼並運行它。但它給我一個錯誤說:語法錯誤,意外的'='。所以我把它改成了「=〜」而不是「〜=」,但是這次再次改爲「http:// http://yahoo.com」的同一個數組......再次增加一個「http: //「元素之前。 – Siddharth

+0

該測試在預編輯代碼中被反轉。它是固定的。 –

0

好吧,夥計們我已經找到了解決這一問題。所以代碼根本不需要選擇方法。它只需要一個三元操作符。所以我的一個班輪代碼是這樣的: -

@[email protected] { |x| x.match(/http:/) ? x : "http://"+x } 

上述代碼使用匹配方法與正則表達式匹配。如果它找到匹配,那麼該元素不變,否則在開始處添加「httP://」字符串。