人们一直告诉我我正在用ruby写"C style iterators",我应该以另一种方式做,没有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来说是非典型的。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循环更好:-)

相关内容

最新更新