Ruby:如何迭代一个哈希数组并将值返回为单个字符串?

14

如果这个问题显而易见,我很抱歉,我只是不太明白。如果我有一个类似于哈希数组的数组:

people = [{:name => "Bob", :occupation=> "Builder"}, {:name => "Jim", :occupation =>
"Coder"}]

我想遍历数组并输出像这样的字符串:"Bob: Builder"。我该怎么做?我知道如何迭代,但仍然有点困惑。目前,我的代码如下:

people.each do |person|
  person.each do |k,v|
    puts "#{v}"
  end
end

我的问题是,我不明白如何同时返回两个值,我只能分别返回每个值。我缺少什么?

谢谢你的帮助。

3个回答

22

请看这里:

puts people.collect { |p| "#{p[:name]}: #{p[:occupation]}" }
或者:
people.each do |person|
  puts "#{person[:name]}: #{person[:occupation]}"
end

针对关于访问数组内元素值的更一般性问题,您需要知道people是一个哈希数组。哈希具有返回键和值的keys方法和values方法。因此,一个更通用的解决方案可能如下:

people.each do |person|
  puts person.values.join(': ')
end

非常感谢!这完全澄清了我的疑惑。再次感谢! - splatoperator
.collect方法效果最佳。.each方法会导致很多重复。如果想使用.each方法,你必须嵌套它。 - Paul Brunache

2

也可以工作:

people.each do |person|
  person.each do |key,value|
    print key == :name ? "#{value} : " : "#{value}\n"
  end
end

输出:

Bob : Builder
Jim : Coder

0

也可以工作:

people.each do |name:, occupation:|
  occupation ||= 'unemployed'
  puts "#{name} : #{occupation}"
end

Ruby 3+(感谢Leo)
people.each do |person|
  person => {name:, occupation:}
  occupation ||= 'unemployed'
  puts "#{name} : #{occupation}"
 end
 

1
我喜欢这个模式,只是想指出它在 Ruby 3+ 中不起作用 - 一个选择是使用右向赋值,例如 people.each { |person| person => { name:, occupation: }; puts "#{name} : #{occupation}" } - Leo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接