select
の代わりに使用する必要がありますmap
。
def search string
@contacts.select { |hash| hash[:city] == string }
end
コードmap
で、ブール値を生成するブロックを使用して配列を試行 (または変換) しました。map
はブロックを取り、 の各要素に対してブロックを呼び出し、ブロックself
によって返された要素を含む新しい配列を構築します。その結果、ブール値の配列が得られました。
select
同様に動作します。これはブロックを受け取り、配列を反復処理しますが、ソース配列を変換する代わりに、ブロックが返す要素を含む配列を返しますtrue
。つまり、選択 (またはフィルタリング) メソッドです。
これら 2 つのメソッドの違いを理解するには、定義例を参照すると便利です。
class Array
def my_map
[].tap do |result|
self.each do |item|
result << (yield item)
end
end
end
def my_select
[].tap do |result|
self.each do |item|
result << item if yield item
end
end
end
end
使用例:
irb(main):007:0> [1,2,3].my_map { |x| x + 1 }
[2, 3, 4]
irb(main):008:0> [1,2,3].my_select { |x| x % 2 == 1 }
[1, 3]
irb(main):009:0>