在块内的上下文中访问整个哈希

时间:2015-04-16 08:58:25

标签: ruby ruby-on-rails-4 hash

说我有这个哈希:

hash = { :c => "three", :a => "one", :b => "two" }

我希望最后有这个:

one, two, three

现在说这很好地嵌套在不同的哈希中。我想避免这样的事情:

puts "#{bigger_hash[0].hash[:a]}, #{bigger_hash[0].hash[:b]}, #{bigger_hash[0].hash[:c]}"

我知道map的这个表单可以让我在没有定义顺序的情况下做这样的事情:

bigger_hash[0].hash.map{|k,v| v}.join(', ')

将输出:

three, one, two

这消除了灵活性。我想按照我想要的顺序明确地解决这些问题(不一定是数字或字母!)

我可以用一种方便的方法来达到这个目的吗?我正在思考以下几点:

bigger_hash[0].hash.magic{"#{a}, #{b} #{c}"}
# or
bigger_hash[9].hash.magic(:a, :b, :c).join(', ')

4 个答案:

答案 0 :(得分:1)

也许这是你的答案:

bigger_hash[9].hash.values_at(:a, :b, :c).join(', ')

答案 1 :(得分:1)

bigger_hash返回什么?我不确定你在寻找什么,但据我所知你想要按keys对哈希进行排序并返回values。检查一下:

> hash = { :c => "three", :a => "one", :b => "two" }
> hash.sort.map{|e| e[1] }.join(' , ')
 => "one , two , three"  # your expected output

> hash.values_at(:a, :b, :c).join(', ')
=> "one, two, three"

答案 2 :(得分:0)

您也可以使用此类型:

hash = { :c => "three", :a => "one", :b => "two" }
Hash[hash.sort].values.join(", ")
# => "one, two, three"

但在这种情况下,map方法更好。

答案 3 :(得分:0)

首先,应该定义排序功能:

sorter = lambda { |o1, o2| o1 <=> o2 }

然后,您可以根据需要对值进行排序:

hash = { :c => "three", :a => "one", :b => "two" }
hash.sort(&sorter).to_h.values.join(', ')
#⇒ one, two, three

E.g。对于逆序,我们得到:

sorter = lambda { |o1, o2| o2 <=> o1 }
hash.sort(&sorter).to_h.values.join(', ')
#⇒ three, two, one

旧版红宝石没有#to_h方法:

hash.sort(&sorter).map(&:last).join(', ')

原位分拣机:

hash.sort(&lambda{ |o1,o2| o1 <=> o2 }).map(&:last).join(', ')
#⇒ "one, two, three"

希望它有所帮助。