15

私はこのような構造体を持っています:

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ますか?

4

4 に答える 4

28

select最初に行う

clients.select{|c| c.type == 'tablet'}.map(&:ip)
于 2013-03-16T00:25:26.220 に答える
13

Ruby 2.7+

Ruby 2.7は、まさにfilter_mapこの目的のために導入されています。それは慣用的でパフォーマンスが高く、すぐに標準になると思います。

例えば:

numbers = [1, 2, 5, 8, 10, 13]
enum.filter_map { |i| i * 2 if i.even? }
# => [4, 16, 20]

これは主題についての良い読み物です。

それが誰かに役立つことを願っています!

于 2019-06-12T15:14:38.757 に答える
11

答えはそれと同じくらい簡単です:

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

条件を使用してマッピングすると、条件に失敗したクライアントにnilが与えられます。これはcompact、保持しただけで、実際にはnil値をフラッシュします。

于 2017-07-12T20:21:02.020 に答える
2

を使用したSergioTulentsevの方法の代替#collect#collectここでの使用は意味的に正しいと思います。OPが使い方を尋ねたのは知っています#mapが、それは私の2セントです。

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)
于 2013-03-16T00:42:53.217 に答える