人们一直在告诉我,我正在用ruby写“C风格迭代器”,我应该这样做,没有i ++的东西

这里的细节并不重要,它只是一个例子,重要的是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来说是不典型的。 Rubyists使用带有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循环更好:-)

Interesting Posts