【问题标题】:Ruby on Rails: hash.each {} issuesRuby on Rails:hash.each {} 问题
【发布时间】:2010-09-30 15:23:23
【问题描述】:

这是我的代码:

records_hash = records[:id].inject({}) { |result,h|
  if result.has_key?(h)
    result[h] += 1
  else
    result[h] = 1
  end
  result
}

@test2 = records_hash.each{|key,value| puts "#{key} is #{value}"}

我的输出应该是这样的:

bozo is 3
bubba is 4
bonker is 5

但它在页面 (<%= @test2 %>) 上呈现如下:

bozo3bubba4bonker5

我已经尝试使用类似块的 .each_key 和 .each-value 并且它们都返回上面相同的字符串。我在 IRB 中运行相同的代码,它按预期工作。

我做错了什么?

【问题讨论】:

    标签: ruby-on-rails ruby hash


    【解决方案1】:

    问题是,puts 返回 nil。

    你想做的是:

    @test2 = ""
    @test2 = records_hash.each { |k,v| s<< "#{k} is #{v}" }
    

    或类似的东西。

    编辑:您在代码示例中分配给@test2 的是.each 块的返回值。

    【讨论】:

    • @test2 = records_hash.each{|key,value| key} 也返回上面提到的字符串,尽管返回值应该是 |key|,对吧?
    • puts 返回 nil 与问题无关。
    • Enumerable.each 返回调用 each 的原始集合。块的返回值无关紧要。如上所述,如果要使用块的返回值,则需要records_hash.map。
    【解决方案2】:

    你可以把它放在你的视图中,而不是把它分配给一个变量。

    【讨论】:

      【解决方案3】:

      您的问题是您正在使用 each 方法来构建您的字符串。你想要的是地图方法。每个方法返回哈希值,map返回块的值。

      你想要这样的东西:

      @test2 = records_hash.map { |k,v| "#{k} is #{v}" }
      

      另外,你不应该像这样构建视图代码,除非它是一个简单的字符串。您的示例意味着您想要每行上的每个唯一元素。所以你的视图应该是这样的:

      <% @records_hash.each do |k,v| %>
      <%= "#{k} is #{v}" %>
      <% end -%>
      

      如果您的视图是 HTML 视图,您还需要在每行之间设置一些分隔符:

      <% @records_hash.each do |k,v| %>
      <%= "#{k} is #{v}" %><br/>
      <% end -%>
      

      <ul>
        <% @records_hash.each do |k,v| %>
        <li><%= "#{k} is #{v}" %></li>
        <% end -%>
      </ul>
      

      【讨论】:

        猜你喜欢
        • 2016-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多