人们一直在告诉我,我正在用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
循环更好:-)