-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=>[]}]

如何从 taglist 中获取指定名称的标签

例如,我想提取用户"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 回答