-1
taglist = [{:name=>"Daniel_Xu_Forever", :tag=>["helo", "world"]},   
{:name=>"kcuf", :tag=>["hhe"]},  
{:name=>"fine", :tag=>[]},   
{:name=>"how hare you", :tag=>[]},  
{:name=>"heki", :tag=>["1", "2", "3"]}, 
{:name=>"railsgirls", :tag=>[]},  
{:name=>"_byoy", :tag=>[]},   
{:name=>"ajha", :tag=>[]},  
{:name=>"nimei", :tag=>[]}]

タグリストから指定した名前のタグを取得する方法

たとえば、ユーザー"fine"のタグを抽出したいですか?

doこれはイテレータなしで達成できますか?

4

4 に答える 4

4

:tagこれにより、ユーザー名のキーの内容が返されます。== 'fine'

taglist.select { |x| x[:name] == 'fine' }.map { |u| u[:tag] }

まず、関心のあるユーザーのみを選択します.select

そして、必要.mapなものだけの配列を収集するために使用します。

この場合、最終結果は次のようになります。[]

于 2012-12-09T09:08:21.453 に答える
2

いいえ、ループなしでは実行できません。

また、コードでループを回避するソリューションを見つけた場合でも、呼び出しているライブラリ関数にループが含まれていることを確認してください。配列内の要素を見つけるには、ループが必要です。限目。

たとえば、この(考案された)例を見てください

  pattern = "fine"
  def pattern.===(h); self == h[:name]; end
  taglist.grep(pattern)

これはループを使用していないようですが、ループを使用してgrep実装されている呼び出しです。

または別の、同様に考案された例

  class Hash; def method_missing(sym); self[sym]; end; end
  taglist.group_by(&:name)["fine"]

これもループなしで呼び出すように見えgroup_byますが、実際にはループします。

 

ですから、答えはノーです。

于 2012-12-09T12:21:00.263 に答える
2

本当にdoイテレータですか?

taglist.find{|tl| tl[:name] == 'fine'}[:tag]

ばかげてどうですか:

eval taglist.to_s[/:name=>"fine", :tag=>(.*?)}/, 1]
#=> []
于 2012-12-09T09:34:54.747 に答える
0

したがって、私の最初の答えはノールールを見逃していdoました。doこれは、ブロックを使用しない回答です。

i=0
begin
  if taglist[i][:name] == 'fine'
    tag = taglist[i][:tag]
    break
  end
  i+=1
end while i < taglist.length - 0

技術的には、これはまだブロックを使用していると思います。しかし、おそらく制限を満たしています。

于 2012-12-09T09:35:07.463 に答える