Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种简单的方法可以在Ruby哈希中按加法的顺序遍历对(即最早的优先)?_Ruby_Hash_Ruby 1.8 - Fatal编程技术网

有没有一种简单的方法可以在Ruby哈希中按加法的顺序遍历对(即最早的优先)?

有没有一种简单的方法可以在Ruby哈希中按加法的顺序遍历对(即最早的优先)?,ruby,hash,ruby-1.8,Ruby,Hash,Ruby 1.8,我创建了一个空哈希,,然后随着时间的推移添加键值对 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 Chaunc

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

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

但我不想这样。我如何按照鸡被添加的顺序在鸡之间循环?

简单的回答是:更新你的Ruby。Ruby1.9已经有多年的历史了,它可以按照您想要的方式工作(当前的Ruby 2.0也是如此)。如果您坚持使用古老的、不受支持的Ruby,那么可以通过gem使用OrderedHash类:

gem install orderedhash
您的代码将变成:

require 'rubygems'
require 'orderedhash'

chickens = OrderedHash.new
# The rest stays the same
同样,我建议您升级Ruby安装

另外,如果你像这样迭代散列,你的代码会更像Ruby:

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

@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开发人员始终避免使用它。原因是,
对于name,mood…
name
mood
添加到局部变量中,这不同于
每个
都将它们限制在
do
块中。在变量空间中乱扔临时变量是不好的形式。例如,运行原始代码后,我可以执行以下操作:

[7] (pry) main: 0> name
"Chauncey"
[8] (pry) main: 0> mood
"forlorn"

我不知道我的红宝石老了!我使用的是CodeAcademy实验室,我认为这是最新的。你知道另一个这样的网站吗,它有当前的Ruby?而且,你也不必那么刻薄。很明显(从我问的问题来看)我对这个很陌生,很明显我想使用当前的受支持版本!我看不出这里有什么卑鄙的地方。直截了当的事实是,为什么会有人,特别是一个像我问的问题“坚持使用古老的、不受支持的红宝石”的笨蛋?他知道我用错了,也不知道还有什么更好的。他怎么可能没有呢?@user2493615如果我的语气听起来对你很刻薄,我很抱歉。我向你保证,这不是故意的。事实上,1.8.7被认为是不受支持的,不适合使用或学习。@user2493615“为什么会有人,特别是一个像我这样问“坚持使用古老的、不受支持的红宝石”的傻瓜呢?他知道我用错了,也不知道更好的方法。他怎么可能没有?”你误读了Darshan的评论并做出了假设。他说的没有错。我们经常看到不能/不会更新的人,所以他在解决我认为“不能”更新的问题。他在回答问题时一直非常友好和准确,所以我认为他在这里是一贯的。总而言之,他说“试试OrderedHash”。