这里的细节并不重要,只是一个例子,重要的是i=0,i+=1动作
def sortAndIndex
#sorting keys
@disco = Hash[@disco.sort]
#basic setup for both input types
@years = @disco.keys
@albums = @disco.values
sum = @years.count
#setup for "albums" input
@allalbums = []
i = 0
sum.times do
thatyear = @years[i] + ", " + @albums[i]
@allalbums << thatyear
i += 1
end
end
现在,这确实起作用了,ruby或大多数其他语言中的任何其他"i++"类型("C样式")迭代器也应该起作用。然而,我一直听说ruby有更好的方法来实现这一点,基本上我会传递第二个参数变量,而不是"a"。
为了做到这一点,我会做什么修改?ruby是否有多个涉及这些I++ary[I]迭代器问题的"快捷方式"?
是的,您应该以"Ruby方式"做事,而不要考虑索引。为什么?因为它是地道的,而且看起来更好。您传入一个代码块,以便在集合的每个元素上执行。元素是如何存储的,按什么顺序存储,如果可以将它们编入索引,这些都无关紧要。
# nice, eh?
some_array.each do |elem|
some_action(elem)
end
如果您需要索引计数器(在您的示例中没有),请使用each_with_index
。
还要注意,在Ruby中,块的概念除了迭代集合之外,还很重要。你有什么…奇怪。。。您应该听取它们的意见,但许多方法将块作为参数(或可选参数),这些参数不返回可以索引的集合。例如,File.open
获取一个块,如果提供,则在块返回时为您关闭文件
此外,还有一件事需要注意;您的命名约定对于Ruby来说是非典型的。Rubisters在underscores_between_words
中使用小写函数和变量名。最好和这里的社区呆在一起。
人们告诉你这件事:
ary.each do |a|
puts a
end
简单多了,不是吗?
更新
这就是我将如何在惯用的ruby 中编写您的更新示例
def sort_and_index
@disco.sort.map do |year, album|
"#{year}, #{album}"
end
end
我不确定您是否需要所有这些实例变量供以后使用。
times
方法不会向块传递第二个参数。您可能正在寻找each_with_index
,它将对象和该对象的索引传递到块:
ary.each_with_index do |object, i|
puts "Index #{i} => #{object.inspect}"
end
但最终是的,Ruby有几种迭代集合的方法,它们都比C风格的for
循环更好:-)