1

这里的细节并不重要,这只是一个例子,重要的是 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] 迭代器问题?

4

3 回答 3

3

是的,您应该以“Ruby 方式”做事,而忘记索引。为什么?因为它是惯用的并且看起来更好。您传入要在集合的每个元素上执行的代码块。元素如何存储,以什么顺序,如果它们可以被索引,都是无关紧要的。

# nice, eh?
some_array.each do |elem|
  some_action(elem)
end

如果您需要一个索引计数器(在您的示例中不需要),请each_with_index改用。

还要注意,除了迭代集合之外,块的概念在 Ruby 中很重要。你有什么......奇怪......你应该听他们,但许多方法将块作为参数(或可选参数),它们不返回可以索引的集合。例如,File.open获取一个块,如果提供,则在块返回时为您关闭文件

另外,还有一点需要注意;您的命名约定对于 Ruby 来说是非典型的。Rubyists 使用小写的函数和变量名underscores_between_words。最好坚持这里的社区。

于 2012-07-09T21:53:39.893 回答
1

人们告诉你这个:

ary.each do |a|
  puts a
end

简单多了,不是吗?

更新

这就是我用惯用的 ruby​​ 编写更新示例的方式

def sort_and_index
  @disco.sort.map do |year, album|
    "#{year}, #{album}"
  end
end

我不确定您是否需要所有这些实例变量以供以后使用。

于 2012-07-09T21:49:54.190 回答
0

times方法不会将第二个参数传递给块。您可能正在寻找each_with_index,它将对象和该对象的索引传递给块:

ary.each_with_index do |object, i|
  puts "Index #{i} => #{object.inspect}"
end

但最终是的,Ruby 有几种迭代集合的方法,它们都比 C 风格的for循环更好:-)

于 2012-07-09T21:53:25.207 回答