【问题标题】:Return hash with modified values in Ruby在 Ruby 中返回带有修改值的哈希
【发布时间】:2010-04-03 18:45:09
【问题描述】:

我正在尝试这个:

{:id => 5, :foos => [1,2,3]}.each {|k,v| v.to_s}

但这会返回:

{:id=>5, :foos=>[1, 2, 3]}

我想看看这个:

{:id=>"5", :foos=>"[1, 2, 3]"}

我还尝试了Hash#collect 和Hash#map 的变体。有什么想法吗?

【问题讨论】:

    标签: ruby arrays hash


    【解决方案1】:

    你可以使用Object#inspect:

    { :id => 5, :foos => [1, 2, 3] }.inject({}) do |hash, (key, value)|
      hash.merge key => value.inspect
    end
    

    返回:

    { :foos => "[1, 2, 3]", :id => "5" }
    

    或者如果您希望它具有破坏性:

    hash = { :id => 5, :foos => [1, 2, 3] }
    hash.each_key { |key| hash[key] = hash[key].inspect }
    

    【讨论】:

    • @rubiii, note 在 Ruby 1.9 中,Array#to_s 产生与 Array#inspect 相同的结果。我不知道以前的版本是否如此。
    • @smotchkiss 我刚刚尝试在 1.9.1-p378 上使用 irb 并且.. 你是对的 :) 不知道。对于 ruby​​ 1.8.7 虽然 [1,2,3].to_s 只返回“123”。
    【解决方案2】:

    你的东西不起作用,因为 v.to_s 没有修改 v,所以基本上这个块没有做任何事情。

    你可以这样做:

    hash = {:id => 5, :foos => [1,2,3]}
    hash.each_key { |k| hash[k] = hash[k].to_s }
    

    如果不想修改哈希:

    hash = {:id => 5, :foos => [1,2,3]}
    new_hash = {}
    hash.each_key { |k| new_hash[k] = hash[k].to_s }    
    

    【讨论】:

    • @glebm,有什么方法可以修改哈希吗?
    • 我编辑了答案,向您展示如何在不修改哈希的情况下做到这一点
    • @glebm,我想要修改原始哈希。我不需要避免修改它:)
    • 问题是对于像 [1, 2, 3] 这样的数组,to_s 返回“123”,而inspect 返回“[1, 2, 3]”。
    • @smotchkkiss:第一种方法确实修改了哈希值。
    猜你喜欢
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2011-05-19
    • 2013-09-01
    • 2016-04-23
    • 2017-03-21
    相关资源
    最近更新 更多