2013-03-16 77 views
5

我有這樣的結構:`map`根據病情

Struct.new("Test", :loc, :type, :hostname, :ip) 

clients = [ 
Struct::TestClient.new(1, :pc, "pc1", "192.168.0.1") 
Struct::TestClient.new(1, :pc, "pc2", "192.168.0.2") 
Struct::TestClient.new(1, :tablet, "tablet1", "192.168.0.3") 
Struct::TestClient.new(1, :tablet, "tablet2", "192.168.0.3") 
and etc... 
] 

如果我想獲得的所有設備的IP地址,我可以使用test_clients.map(&:ip)。如何選擇特定設備的IP地址,例如稱爲"tablet"的所有設備類型?我該怎麼做map

回答

10

執行使用#collect謝塞爾希奧Tulentsev的方法的第一select

clients.select{|c| c.type == 'tablet'}.map(&:ip) 
-1

的替代。我認爲在這裏使用#collect在語義上是正確的。我知道O.P.問如何使用#map,但這是我的兩分錢。

clients.collect { |c| c.ip if c.type == "tablet" } # will return nils for clients where the type is not "tablet" 

# or 

clients.select { |c| c.type == "tablet" }.collect(&ip) 
+0

對於重複的答案很抱歉,多次點擊退格鍵,回到創建而不是編輯。 – silasjmatson 2013-03-16 00:44:49

+0

我很好奇,你如何區分'collect'和'map'之間的區別?另外,'收集(&IP)'返回你期望的? – 2013-03-16 00:47:01

+0

當我剛剛從一組對象中獲取值時,我通常使用'collect',而當我在塊中執行一堆邏輯時,會使用'map',或者返回一個已更改值的數組。我錯了嗎? – silasjmatson 2013-03-16 00:50:57

0

答案是如此簡單:

與條件
clients.map { |client| client.ip if client.type == 'tablet' }.compact 

映射將給予其失敗的情況,對於客戶尼爾斯只有我們保持compact,這實際上將刷新零值。

+1

Sergio Tulentsev的回答中沒有必要使用'select'和'map',因爲它會導致兩個循環並且相對較慢。 – 2017-07-12 20:21:56