1

我创建了一个空的 hash chickens,然后随着时间的推移添加键值对。

chickens = {} 
chickens.merge!("Davison"=>"plucky")
chickens.merge!("Mortimer"=>"sullen")
chickens.merge!("Chauncey"=>"forlorn") 

for name,mood in chickens do puts "#{name}: #{mood}" end

生产

Mortimer: sullen
Chauncey: forlorn
Davison: plucky

但我不想要这个。我如何按添加的顺序循环浏览鸡?

4

2 回答 2

2

简短的回答是:更新你的 Ruby。Ruby 1.9 已有多年历史,可以按照您想要的方式工作(就像当前的 Ruby 2.0 一样)。如果你坚持使用古老的、不受支持的 Ruby,可以通过 gem 获得 OrderedHash 类:

gem install orderedhash

您的代码将变为:

require 'rubygems'
require 'orderedhash'

chickens = OrderedHash.new
# The rest stays the same

同样,我建议您只升级您的 Ruby 安装。

PS如果您像这样遍历哈希,您的代码将更像Ruby:

chickens.each do |name, mood|
  puts "#{name}: #{mood}"
end
于 2013-06-22T05:54:53.327 回答
0

@DarshanComputing 开始谈论使代码更像 Ruby,但这是我将如何完整地编写示例代码:

chickens = {} 
chickens["Davison"] = "plucky"
chickens["Mortimer"] = "sullen"
chickens["Chauncey"] = "forlorn"

chickens.each do |name, mood| 
  puts "#{name}: #{mood}"
end

使用merge很好,但也很冗长。您会看到很多 Ruby 程序员采用更简单的方法,直接添加键/值对,而不是依赖于变异方法。

用于for循环某些东西绝对不像 Ruby。尽管该语言支持它,但 Ruby 开发人员始终避免使用它。原因是,for name, mood ...name和添加mood到局部变量中,这与each将它们限制在do块内不同。用临时变量乱扔变量空间是不好的形式。例如,在运行原始代码后,我可以这样做:

[7] (pry) main: 0> name
"Chauncey"
[8] (pry) main: 0> mood
"forlorn"
于 2013-06-23T06:03:14.220 回答