0

ハッシュの配列を検索し、検索文字列に基づいて値を返す方法を考えています。たとえば、@contactsにはハッシュ要素、、、:full_nameおよび:cityが含まれます:email。変数@contacts(おそらく配列になると思います)には、3つのエントリ(おそらく行)が含まれています。:city以下は、値に基づいて検索を実行するためにこれまでに持っているコードです。しかし、それは機能していません。誰かが私に何が起こっているのかを教えてもらえますか?

def search string
  @contacts.map {|hash| hash[:city] == string}
end
4

2 に答える 2

2

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>
于 2013-01-27T04:18:48.677 に答える
1

あなたはこれを試すことができます:

 def search string
    @contacts.select{|hash| h[:city].eql?(string) }
 end

これにより、文字列に一致するハッシュの配列が返されます。

于 2013-01-27T04:17:41.073 に答える